【问题标题】:How to convert a Java TreeMap to a Scala SortedMap?如何将 Java TreeMap 转换为 Scala SortedMap?
【发布时间】:2012-08-28 10:00:14
【问题描述】:

在“不耐烦的 Scala”中的章节和示例之后,有一个与将 Java TreeMap 用作 Scala SortedMap 相关的练习。在 scala shell 中,我尝试了这个:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    我还没有读过那本书,但你需要下定决心。 t 是 Scala SortedMap 还是 Java TreeMap

    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 在 Scala 2.10 中已被弃用,而支持 JavaConverters,这需要特定的 .asScala 方法来进行转换。

    不幸的是JavaConverters 也没有任何东西可以产生SortedMap.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 显然有点没有意义,因为它是空的,但是您应该了解如何处理现有的 TreeMap。如果您没有现有的,只需在 Scala 中生成一个新的SortedMap

    【讨论】:

    • 好的,感谢您的澄清。我以为我可以生成 Java TreeMap 的 scala SortedMap“视图”,但我想这是不可能的。将 .asScala 转换为 mutable.Map 可能就足够了。
    【解决方案2】:
    import collection._
    import JavaConverters._
    
    var t: scala.collection.SortedMap[String,Int] = 
        new java.util.TreeMap[String,Int]().asScala.map(identity)(breakOut)
    

    【讨论】:

    • 我相信这会创建 TreeMap 的副本而不是视图(因此当原始 TreeMap 被修改时,副本不会显示)。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2010-11-07
    • 2019-03-15
    相关资源
    最近更新 更多