斯卡拉:哪个更好 - 然后联盟或联盟与众不同?

时间:2015-10-11 17:36:24

标签: arrays list scala distinct union

如果我有两个清单:

  • listA - 100万字符串,
  • listB - 100万字符串

我希望将它们合并到第三个listC,它只包含上述两个列表中的唯一值,以下哪种方法更好:

  1. 在加入listC OR之前,取一个listA和listB的distinct(),
  2. 生成工会化的listC,然后在listC上应用distinct
  3. 相同的逻辑是否也适用于数组?

2 个答案:

答案 0 :(得分:3)

让我们看看distinct实施:

def distinct: Repr = {
  val b = newBuilder
  val seen = mutable.HashSet[A]()
  for (x <- this) {
    if (!seen(x)) {
      b += x
      seen += x
    }
  }
  b.result()
}

出于性能原因,它使用可变结构。

因此,如果性能存在问题,您可以采用相同的方式实现不同的联合:

def distinctUnion[E](listA: Seq[E], listB: Seq[E]): Seq[E] = {
  val b = Seq.newBuilder[E]
  val seen = mutable.HashSet[E]()
  for (x <- listA) {
    if (!seen(x)) {
      b += x
      seen += x
    }
  }
  for (x <- listB) {
    if (!seen(x)) {
      b += x
      seen += x
    }
  }
  b.result()
}

答案 1 :(得分:1)

您需要先进行联合,但是您希望以惰性方式执行此操作,以避免在内存中创建联合集合。这样的事情应该有效:

val listC = (listA.view union listB).distinct.toList

计算上,这可能最终会做一些与Jean发布的非常类似的事情,但它更好一点,因为它更好地利用了Scala集合库。