您可以使用
diff
代替
slice
:
list.map(set => set diff (list diff List(set)).flatten.toSet)
//Alternative with filterNot
list.map(set => set.filterNot((list diff List(set)).flatten.contains))
diff
在这里起作用,因为它只会删除一个元素实例,而 Set[Int]
具有一个很好的 equals
方法:
List(Set(1), Set(1, 2)) diff List(Set(1))
List(Set(1), Set(1)) diff List(Set(1))
因此,将一个集合映射到列表中的所有其他集合:
val setWithOthers = list.map(set => set -> (list diff List(set)))
val setWithOthers = (list, list.map(list diff List(_))).zipped.toList //equivalent, less efficient
如果你想在list
的元素上映射函数f
,你可以这样做:
setsWithOthers.map { case(set, others) => f(set, others) }
setsWithOthers.map(kvp => f(kvp._1, kvp._2))
setsWithOthers.map((f _).tupled)
您还可以创建完整的多重集合,以跟踪每个元素出现的次数。 然后,在循环的每次迭代中,您可以从完整的多重集合中“减去”一个集合:
val multiset = list.flatten.groupBy(identity).mapValues(_.length)