在groovy中排序地图

F21*_*F21 19 java groovy map

我有兴趣在groovy中使用有序映射(使用gremlin,它是用于图形数据库的DSL).

我在这里查看了有关排序地图的博客文章,但我仍然有点困惑.

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

  • 使用有序地图时,插入到列表中的项目是否按插入顺序排列?或者我必须sort{}在排序地图中的项目排序之前运行?

tim*_*tes 40

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

def m = [:]
Run Code Online (Sandbox Code Playgroud)

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

assert m.getClass().name == 'java.util.LinkedHashMap'
Run Code Online (Sandbox Code Playgroud)

如果你查看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]
Run Code Online (Sandbox Code Playgroud)

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

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

// def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well
TreeMap tm = [ tim_yates:1, F21:2 ]
Run Code Online (Sandbox Code Playgroud)

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

println map // prints [F21:b, tim_yates:a]
Run Code Online (Sandbox Code Playgroud)

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