如何在 Scala 中从 List[Array[String]] 中获取一个集合



我是 scala 的新手,我有以下代码:

val content = List("a b","a b")

给我:List[String] = List(a b, a b)

val split_data = content.map(testFile => testFile.split("t"))

给我:List[Array[String]] = List(Array(a b), Array(a b))

我想从列表中得到一套,但是split_data.toSet给我:scala.collection.immutable.Set[Array[String]] = Set(Array(a b), Array(a b))

虽然我想要

scala.collection.immutable.Set[Array[String]] = Set(Array(a b))

我该怎么做?

在 Scala 中,具有相同值的两个数组不相等,与其他集合相反:

Array(1, 2, 3) == Array(1, 2, 3) // false
List(1, 2, 3)  == List(1, 2, 3)  // true

这是因为数组只是 Java 数组,它们与函数式语言中的集合没有相同的语义。在 Java 中,如果两个数组引用指向内存中的同一数组,则它们相等:

val a = Array(1, 2, 3)
a == a              // true, it's the same array
a == Array(1, 2, 3) // false, it's two different arrays

因此,如果你想拥有一组独特的集合,你必须将数组转换为 Scala 序列:

val content = List("a b","a b")
val split_data = content.map(testFile => testFile.split("t").toSeq)  // note the .toSeq
split_data.toSet   // set with one element

你不能像另一个答案中解释的那样比较这样的数组。 解决此问题的最简单方法是在.map之前进行 dedup(转换为Set

(:
content.toSet[String].map(_.split("t"))

这也更有效,因为您最终split更少的字符串。

最新更新