我正在使用TreeMap
,它在以下代码中表现得很奇怪。
以下是代码:
import scala.collection.immutable.TreeMap
object TreeMapTest extends App{
val mp = TreeMap((0,1) -> "a", (0,2) -> "b", (1,3) -> "c", (3,4) -> "f")
mp.keys.foreach(println) //A
println("****")
mp.map(x => x._1).foreach(println) //B
}
正如您所看到的那样,两条打印线(A和B)应该打印相同的内容,但结果如下:
(0,1)
(0,2)
(1,3)
(3,4)
****
(0,2)
(1,3)
(3,4)
为什么会发生这种情况?有趣的是,即使IDE认为可以互换使用这两个并建议替换。
答案 0 :(得分:3)
Scala集合库通常会尝试返回它开头的同类集合,以便例如val seq: Seq[Int] = ...; seq.map(...)
将返回Seq
,val seq: List[Int] = ...; seq.map(...)
将返回List
等。这不可能永远:例如: String
被视为Char
的集合,但"ab".map(x => x.toInt)
显然无法返回String
。同样适用于Map
:如果您map
每对配对非配对,则无法获得Map
返回;但是您将每对映射到一对(Int, Int)
,因此Scala返回Map[Int, Int]
。因此,您无法同时获得(0, 1)
和(0, 2)
:它们将是重复的密钥。
要避免此问题,请先将地图转换为Seq[((Int, Int), String)]
:mp.toSeq.map(x => x._1)
(或mp.keySet.toSeq
)。