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

时间:2018-08-29 02:26:22

标签: scala

我对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))

我该怎么做?

2 个答案:

答案 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的字符串。