Scala中的TreeMap键和迭代

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala中的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认为可以互换使用这两个并建议替换。

答案

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)。

以上是关于Scala中的TreeMap键和迭代的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历TreeMap的PORTION?

TreeMap中的keySet()方法的功能

对比hashtable,hashmap,treemap的区别

在 Spark Scala 中的列上运行累积/迭代 Costum 方法

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

HashMap 或 TreeMap 或 LinkedHashMap 哪个迭代最快?