如何从scala中的两个字符串列表中获取唯一元素?

时间:2012-07-19 10:50:42

标签: scala

我有两个要比较的清单:

列出一个:

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

列表二:

List("one","two")

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

5 个答案:

答案 0 :(得分:6)

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

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的限制,但你无论如何都不会绕过它。