我对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))
我该怎么做?
答案 0 :(得分:3)
在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
答案 1 :(得分:2)
您不能像其他答案中所述比较数组。
解决此问题的最简单方法是在Set
之前进行dedup(转换为.map
):
content.toSet[String].map(_.split("\t"))
这也更有效率,因为您最终减少了split
的字符串。