我是 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
更少的字符串。