在groovy中排序地图

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

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

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

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

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

 def m = [:] 

然后,您可以看到Groovy默认生成LinkedHashMap

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

如果你查看LinkedHashMap的文档,它会说:

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

所以LinkedHashMap有一个订单,你可以通过调用sort来影响Groovy中的顺序

 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不会自动保持排序。