我有两个要比较的清单:
列出一个:
List("one","two","three","four")
列表二:
List("one","two")
如何从这两个列表中获取唯一值?
答案 0 :(得分:6)
如果您的两个列表是r1
和r2
,并且假设您希望每个列表中的值不存在于另一个列表中:
r1.filterNot(r2.contains) ::: r2.filterNot(r1.contains)
或
r1.diff(r2) ::: r2.diff(r1)
答案 1 :(得分:3)
将它们变成集合,并获得交集。然后,如果您愿意,可以将其重新设置为Seq
,但首先要问自己是否必须首先Seq
,而不是Set
。
scala> List("one","two","three","four").toSet & List("one","two").toSet
res0: scala.collection.immutable.Set[String] = Set(one, two)
答案 2 :(得分:2)
答案 3 :(得分:1)
我使用List(1, 2, 3, 4) ::: List(1, 2, 5) distinct
来解决这个问题。它返回List(1, 2, 3, 4, 5)
。
答案 4 :(得分:0)
我建议将以下内容用于O(m + n)运行时间(假设输入数组已排序)。
def mergeUniqueSortedArrays( A: Array[String], B: Array[String] ): Array[String]= {
val n = A.length
val m = B.length
var C = Array[String]()
var i = 0
var j = 0
while (i < n && j < m) {
if (i == n) {
if ( B(j) != A(i-1) ) {
C :+= B(j)
}
j+=1
}
else if (j == m) {
if ( A(i) != B(j-1) ) {
C :+= A(j)
}
i+=1
}
else {
if ( A(i) < B(j) ) {
if (C.length == 0 || A(i) != C(C.length-1)) {
C :+= A(i)
}
i+=1
}
else if ( B(j) < A(i) ) {
if (C.length == 0 || B(j) != C(C.length-1)) {
C :+= B(j)
}
j+=1
}
else {
if (C.length == 0 || A(i) != C(C.length-1)) {
C :+= A(i)
}
i+=1
j+=1
}
}
}
return C
}
-
注意:如果输入数组没有排序,那么您可以轻松地对输入数组进行排序,它将在O(max {(n + m),(n log n)})时间运行,假设n> m
注意:O(n + m)时间在技术上假定字符串长度受常数k的限制,但你无论如何都不会绕过它。