我有两个要比较的列表:
清单一:
List("one","two","three","four")
列举二:
List("one","two")
如何从这两个列表中获取唯一值?
如果您的两个列表是r1
and r2
,并且假设您希望每个列表中的值不存在于另一个列表中:
r1.filterNot(r2.contains) ::: r2.filterNot(r1.contains)
或者
r1.diff(r2) ::: r2.diff(r1)
把它们变成集合,然后得到交叉点。然后,您可以根据需要将其转回Seq
,但首先要问自己他们是否必须Seq
排在第一位,而不是Set
.
scala> List("one","two","three","four").toSet & List("one","two").toSet
res0: scala.collection.immutable.Set[String] = Set(one, two)
我List(1, 2, 3, 4) ::: List(1, 2, 5) distinct
用于这个问题。它返回List(1, 2, 3, 4, 5)
。
我建议使用以下 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
}
--
注意:如果输入数组未排序,那么您可以轻松地对输入数组进行排序,假设 n>m,它将在 O(max{(n + m), (n log n)}) 时间内运行。
注意: O(n + m) 时间在技术上假设字符串长度受常数 k 的限制,但无论如何你都不会绕过它。