因此,我有一个元素列表,我想获得所有列表的列表,这些列表可以通过从原始列表中选择任意数量的元素来生成。
对于此输入: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
方法找到了类似问题的几种解决方案,但都不能满足我的所有要求:
我认为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))
如果您可以不保留原始顺序(即用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))