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(...)
将返回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
)。
以上是关于Scala中的TreeMap键和迭代的主要内容,如果未能解决你的问题,请参考以下文章
对比hashtable,hashmap,treemap的区别
在 Spark Scala 中的列上运行累积/迭代 Costum 方法