【问题标题】:Sorted maps in groovygroovy中的排序地图
【发布时间】:2012-11-04 19:43:38
【问题描述】:

我有兴趣在 groovy 中使用排序地图(使用 gremlin,它是图形数据库的 DSL)。

我在 sorted maps here 上看过这个 blog post,但我还是有点困惑。

  • 如何声明有序映射?与地图y = [:]的标准方式有什么不同吗?

  • 使用排序映射时,插入到列表中的项目是否会按照它们插入的顺序?或者我必须在排序映射中的项目排序之前运行sort{}

【问题讨论】:

    标签: java groovy map


    【解决方案1】:

    如果你只是像这样声明一个地图:

    def m = [:]
    

    然后,你可以看到 Groovy 默认会生成一个LinkedHashMap

    assert m.getClass().name == 'java.util.LinkedHashMap'
    

    如果您查看documentation for LinkedHashMap,它会说:

    Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。该链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。

    所以LinkedHashMap 有一个订单,您可以在 Groovy 中通过调用 sort 来影响该订单

    def m = [ b:1, a:2 ]
    
    // Sort by descending value
    m = m.sort { -it.value }
    
    println m // prints [a:2, b:1]
    

    如果您想要键的自然排序,那么您可以使用 Java 的排序映射之一,例如 TreeMap

    要说你想在 Groovy 中使用它,你可以这样做:

    // def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well
    TreeMap tm = [ tim_yates:1, F21:2 ]
    

    然后打印这个,你可以看到它是按键排序的:

    println map // prints [F21:b, tim_yates:a]
    

    TreeMap 将在您添加密钥时保持顺序。当您添加新值时,LinkedHashMap 不会自动保持排序状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      相关资源
      最近更新 更多