Scala中的TreeMap键和迭代

时间:2016-09-12 06:13:48

标签: scala collections treemap

我正在使用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认为可以互换使用这两个并建议替换。

1 个答案:

答案 0 :(得分:3)

Scala集合库通常会尝试返回它开头的同类集合,以便例如val seq: Seq[Int] = ...; seq.map(...)将返回Seqval 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)。