通过它们中的元素的差异来分隔两个列表

时间:2014-10-20 18:41:11

标签: list scala collections scala-collections scalaz

如果我有

val incomingIds : List[Int] = ....
val existingIds : List[Int] = //this makes db calls and find existing records (only interested in returning ids)

现在接下来我想以下列方式将incomingIdsexistingIds进行比较

说我有

val incomingIds : List[Int] = List(2,3,4,5)
val existingIds : List[Int] = List(1,2,3,6)

以上示例建议我的API应该能够找到要删除的idsincomingIds但不在existingIds中)。在此示例existingIds中有1,4,5incomingIds表示1,4,5表示val idsForDeletion :List[Int]

}

val idsForInsertion :List[Int]. 

并会有另一个名单称之为

6

所以idsForInsertion应该进入{{1}}列表。

有一种简单的方法来分区列表吗?

2 个答案:

答案 0 :(得分:5)

您可以使用scala的filterNot函数过滤每个列表中未包含在另一个列表中的项目:

val idsForDeletion = existingIds.filterNot(incomingIds.toSet)
val idsForInsertion = incomingIds.filterNot(existingIds.toSet)

答案 1 :(得分:5)

您可以使用diff

def diff(that: collection.Seq[A]): List[A]

它计算此列表与另一个序列之间的多集差异。

scala> val incomingIds : List[Int] = List(2,3,4,5)
incomingIds: List[Int] = List(2, 3, 4, 5)

scala> val existingIds : List[Int] = List(1,2,3,6)
existingIds: List[Int] = List(1, 2, 3, 6)

scala> (incomingIds diff existingIds).toSet
res1: scala.collection.immutable.Set[Int] = Set(4, 5)

scala> (existingIds diff incomingIds).toSet
res2: scala.collection.immutable.Set[Int] = Set(1, 6)