1

我有两个要比较的列表:

清单一:

List("one","two","three","four")

列举二:

List("one","two")

如何从这两个列表中获取唯一值?

4

5 回答 5

7

如果您的两个列表是r1and r2,并且假设您希望每个列表中的值不存在于另一个列表中:

r1.filterNot(r2.contains) ::: r2.filterNot(r1.contains)

或者

r1.diff(r2) ::: r2.diff(r1)
于 2012-07-19T10:55:53.140 回答
3

把它们变成集合,然后得到交叉点。然后,您可以根据需要将其转回Seq,但首先要问自己他们是否必须Seq排在第一位,而不是Set.

scala> List("one","two","three","four").toSet & List("one","two").toSet
res0: scala.collection.immutable.Set[String] = Set(one, two)
于 2012-07-19T16:22:46.457 回答
2

对 Set 使用差分运算符&~

http://www.scala-lang.org/api/current/scala/collection/immutable/Set.html

于 2012-07-19T10:53:30.120 回答
1

List(1, 2, 3, 4) ::: List(1, 2, 5) distinct用于这个问题。它返回List(1, 2, 3, 4, 5)

于 2012-07-19T12:52:34.230 回答
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
}

--

注意:如果输入数组未排序,那么您可以轻松地对输入数组进行排序,假设 n>m,它将在 O(max{(n + m), (n log n)}) 时间内运行。

注意: O(n + m) 时间在技术上假设字符串长度受常数 k 的限制,但无论如何你都不会绕过它。

于 2017-01-31T13:52:41.553 回答