获取部分列表的列表

问题描述 投票:1回答:2

因此,我有一个元素列表,我想获得所有列表的列表,这些列表可以通过从原始列表中选择任意数量的元素来生成。

对于此输入:val input = List('a','b','a')

我希望此输出:val input = List(List(), List('a'), List('b'), List('a','a'), List('a', 'b'), List('a','b','a'))

请注意,我不想包含List('b','b'),因为'b'在原始集合中仅出现一次,并且我不想包含List('b','a'),因为它已经以不同的顺序包含了。

我已经基于Set类的subsets方法或combinations方法找到了类似问题的几种解决方案,但都不能满足我的所有要求:

  • 允许在原始收藏夹中进行重复
  • 具有任意大小的“子列表”
  • 排除已经以不同顺序出现的“子列表”。
scala
2个回答
1
投票

我认为combinations()会做您想要的。所有子列表均以升序显示。

val input = List('a','b','a')

(0 to input.length).flatMap(input.combinations)
//res0: IndexedSeq[List[Char]] =
//      Vector(List(), List(a), List(b), List(a, a), List(a, b), List(a, a, b))

1
投票

如果您可以不保留原始顺序(即用List('a', 'a', 'b')代替List('a', 'b', 'a')),可以对每个子集大小执行combinations

val input = List('a', 'b', 'a')

val result = for {
  i <- 1 to input.size
  comb <- input.combinations(i).toList
} yield comb

// Vector(List(a), List(b), List(a, a), List(a, b), List(a, a, b))
© www.soinside.com 2019 - 2024. All rights reserved.