2012-08-28 63 views
3

以下内容以及“Scala for the Impatient”中的章节和示例,有一个练习涉及使用Java TreeMap作为Scala SortedMap。在斯卡拉壳,我试过这个:如何将Java TreeMap转换为Scala SortedMap?

var t: scala.collection.SortedMap[String,Int] = new java.util.TreeMap[String,Int]() 

但我得到一个关于类型不匹配的错误消息。有没有简单的方法来做到这一点?

注:我做的scala.collection.JavaConversions._进口,然后做:

var t: SortedMap[String,Int] = TreeMap[String,Int]() 

这工作,但变量t具有类型java.util.SortedMap,不scala.collection.SortedMap

回答

2

我还没有读过那本书,但是你需要开始理智。是t a Scala SortedMap或者它是Java TreeMap

A TreeMap不是SortedMap,因此您不能将其分配给SortedMap变量而不进行转换。 JavaConversions会做一些转换为你,包括:

implicit def mapAsScalaMap [A, B] (m: Map[A, B]): Map[A, B] 
    Implicitly converts a Java Map to a Scala mutable Map. 

但是没有什么可以转换为SortedMap

如果这种转换显得神秘给你,图书馆的设计师会同意,所以JavaConversions在斯卡拉2.10不赞成,赞成JavaConverters,这需要一个特定的.asScala方法做了转换。 (.asScala给出mutable.Map)。所以你需要用它的元素重建集合。

import collection.JavaConverters._ 
import collection.SortedMap 
var t: SortedMap[String, Int] = 
    SortedMap[String, Int]() ++ new java.util.TreeMap[String,Int].asScala 

生产在上面的代码的新TreeMap的显然有点无意义,因为它是空的,但你应该得到的如何处理现有的想法。如果你没有现有的,只需在Scala中生成一个新的SortedMap即可。

+0

好的,谢谢你的澄清。我以为我可以产生一个Java TreeMap的Scala SortedMap“视图”,但我想这是不可能的。将.asScala转换为mutable.Map可能就足够了。 –

1
import collection._ 
import JavaConverters._ 

var t: scala.collection.SortedMap[String,Int] = 
    new java.util.TreeMap[String,Int]().asScala.map(identity)(breakOut) 
+0

我相信这会创建一个TreeMap的副本,而不是一个视图(所以当原始TreeMap被修改时,副本将不会显示该副本)。 – Mike