Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从两个序列中筛选出常见条目,返回两个列表,其中包含来自原始序列的唯一条目_Scala_Sequences - Fatal编程技术网

Scala 从两个序列中筛选出常见条目,返回两个列表,其中包含来自原始序列的唯一条目

Scala 从两个序列中筛选出常见条目,返回两个列表,其中包含来自原始序列的唯一条目,scala,sequences,Scala,Sequences,我想从两个列表中筛选出公共元素,然后留下两个包含剩余元素的列表 我在scala中有两个序列: val firstSeq = Seq(1,2,3,4) val secondSeq = Seq(1,3,5,7) val filteredFirstSeq = firstSeq.filterNot(firstEntry => secondSeq.contains(firstEntry)) val filteredSecondSeq = secondSeq.filterNot(secondEntr

我想从两个列表中筛选出公共元素,然后留下两个包含剩余元素的列表

我在scala中有两个序列:

val firstSeq = Seq(1,2,3,4)
val secondSeq = Seq(1,3,5,7)
val filteredFirstSeq = firstSeq.filterNot(firstEntry => secondSeq.contains(firstEntry))
val filteredSecondSeq = secondSeq.filterNot(secondEntry => firstSeq.contains(secondEntry))
我想做的是过滤所有的公共元素,这意味着我最终会得到:

filteredFirstSeq = Seq(2,4)
filteredSecondSeq = Seq(5,7)
因此,在scala中有一种简单的方法:

val firstSeq = Seq(1,2,3,4)
val secondSeq = Seq(1,3,5,7)
val filteredFirstSeq = firstSeq.filterNot(firstEntry => secondSeq.contains(firstEntry))
val filteredSecondSeq = secondSeq.filterNot(secondEntry => firstSeq.contains(secondEntry))
但是!这意味着我必须运行整个第一个列表和匹配项,以及整个第二个列表和匹配项,当列表很大且条目比整数复杂时,这需要很长时间

我更倾向于只需在所有内容中循环一次,但我能想到的唯一方法是创建可变列表,并在找到匹配项时从两者中删除一个值。不过,这似乎有点令人讨厌。我确信,对于这件事,一定有一个我不知道的微不足道的答案


谢谢你的建议

本例假设每个列表都不包含重复项,如果不是这样,则折叠内部的逻辑必须稍微更改

val firstSeq = Seq(1,2,3,4)
val secondSeq = Seq(1,3,5,7)

// Put everything into a list, keeping track of where things came from
val both: Seq[(Int, Int)] = firstSeq.map(x => (x, 1)) ++ secondSeq.map(x => (x, 2))

// Reduce the list into a single map, where the keys are the numbers, and the value is the originating seq.  Anytime we try to insert a value that already is in the map, we remove the value instead, since that will mean the value was in each sequence.
val map: Map[Int, Int] = both.foldLeft(Map.empty[Int, Int]) { (map, tuple) =>
  val (value, seqNumber) = tuple
  if (map.contains(value)) {
    map - value
  } else {
    map + (value -> seqNumber)
  }
}

// Now partition the values back into their original lists
val (firstSeqFiltered, secondSeqFiltered) = map.partition(_._2 == 1)
println(firstSeqFiltered.keys)
println(secondSeqFiltered.keys)
输出:

Set(2, 4)
Set(5, 7)

这些列表是否保证我的唯一性?例如,单个列表中是否会有重复项?有一种更简洁的方法可以获得您想要的内容:
firstSeq diff secondSeq
及其补充
secondSeq diff firstSeq
。不幸的是,很明显,它不是一次遍历。