Scala/如何根据两个值删除元组数组的重复项?

Scala / How to remove duplicates of an array of tuples based on two values?

我有一个包含数百万个元组元素的数组,例如:

var arr: ArrayBuffer[(String, String)] = ArrayBuffer[(String, String)]()
arr += (("Hamburg", "Street1"))
arr += (("Hamburg", "Street2"))
arr += (("Hamburg", "Street1")) // duplicate - remove
arr += (("Berlin",  "StreetA"))
arr += (("Berlin",  "StreetZ"))
arr += (("Berlin",  "StreetZ")) // duplicate - remove
arr += (("Berlin",  "StreetA")) // duplicate - remove

我现在想删除该数组中的重复项,其中 City 和 Street 相等。 类似于:

arr.distinctBy(_._1&_._2) // doesn't work just for illustration

是否有一个简单的解决方案,如何获得如下输出:

(("Hamburg", "Street1"))
(("Hamburg", "Street2"))
(("Berlin",  "StreetA"))
(("Berlin",  "StreetZ"))

在您的阵列上调用 arr.toSet 将执行您需要的操作:

arr.toSet 
res34: Set[(String, String)] = Set(
  ("Hamburg", "Street1"),
  ("Hamburg", "Street2"),
  ("Berlin", "StreetA"),
  ("Berlin", "StreetZ")
)

元组是 case classes,因此提供了 equalshashCode 方法来支持比较。

如果您的用例是确保集合不包含重复项,您通常应该使用 set。这允许您的代码的其他读者推断集合中没有重复项。

由于 equalshashCode 被元组覆盖,您可以使用 distinct 实际上是 distinctBy(identity):

val result = arr.distinct