23

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

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

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

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

4

1 回答 1

49

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

def m = [:]

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

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

如果您查看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]

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

于 2012-11-16T09:27:05.947 回答