list - 将列表的元素与所有其他元素进行比较

标签 list scala scala-collections

假设我有一个 Scala 列表,

val list : List[Set[Int]] = List(set1, set2, set3, set4)

我的列表中的每个元素都是一组整数。

我正在寻找一种优雅的方式来创建一个列表,其中我的列表中的每个元素都与所有 其他元素进行比较。例如,我可能想要生成一个列表,其中每个元素(集合)仅包含不包含在列表的任何其他元素中的元素。

例如我有一些功能:

def f(element : Set[Int], rest_of_list : List[Set[Int]]) : Set[Int]

我想做一些类似于 list.map(f(_, rest_of_list)) 的事情,而不必为每个元素构造 rest_of_list。我现在能想到的唯一方法是使用 slice,这使它非常丑陋且效率低下,imo。

最佳答案

您可以使用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, 2))
List(Set(1), Set(1)) diff List(Set(1)) //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

因此,如果您想将函数 f 映射到 list 的元素中,您可以这样做:

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)

关于list - 将列表的元素与所有其他元素进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357381/

相关文章:

python - 你如何将一个列表(无限长)随机分成 3 个子组?

scala - 是否可以将多个 map 和 reduce 函数组合到 Scala 中的单个 channel 中?

c# - C# 中的整数范围列表

python - 如何按数字部分的升序对字符串列表进行排序

list - LISP:从另一个列表中已存在的元素中删除元素

scala - 表示与 < : and <:< in Scala 的子类型关系

scala - Scala JavaConverters似乎不适用于静态方法返回的集合

scala - 用自然语言(Scala)枚举列表的最佳方法是什么?

scala - 流是理想的吗?

scala - 有效地返回 scala 排序集合中不存在键的下一个较大值?