Scala 从两个序列中筛选出常见条目,返回两个列表,其中包含来自原始序列的唯一条目
我想从两个列表中筛选出公共元素,然后留下两个包含剩余元素的列表 我在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
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
。不幸的是,很明显,它不是一次遍历。