如果我有两个清单:
我希望将它们合并到第三个listC,它只包含上述两个列表中的唯一值,以下哪种方法更好:
相同的逻辑是否也适用于数组?
答案 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集合库。