实现Map并保持插入顺序的Java类?

我正在寻找一个具有键值关联的java类,但不使用散列。 这是我目前正在做的事情:

  1. 将值添加到Hashtable
  2. 获取Hashtable.entrySet()的迭代器。
  3. 遍历所有的值和:
    1. 获取迭代器的Map.Entry
    2. 根据值创build一个Module (一个自定义类)types的对象。
    3. 将该类添加到JPanel。
  4. 显示面板。

问题在于,我无法控制返回值的顺序,因此无法按给定顺序显示值(不对指令进行硬编码)。

我会为此使用一个ArrayListVector ,但后来在代码中,我需要抓住一个给定的密钥的Module对象,我不能用一个ArrayListVector

有谁知道一个免费/开放源代码的Java类将做到这一点,或者一种方式来获取值的基础上添加Hashtable

谢谢!

我build议一个LinkedHashMap或一个TreeMap 。 一个LinkedHashMap按照它们插入的顺序保存这些键,而一个TreeMap则通过Comparator或者元素的自然Comparablesorting保持sorting。

由于不需要保持元素的sorting,所以在大多数情况下, LinkedHashMap应该更快。 对于containsKeygetputremove ,根据Javadocs, TreeMap具有O(log n)性能,而LinkedHashMap则为O(1)

如果您的API仅仅需要可预测的sorting顺序,而不是特定的sorting顺序,请考虑使用这两个类实现的接口, NavigableMapSortedMap 。 这将允许您不要将特定的实现泄露到您的API中,然后切换到这些特定的类中,或者随意执行一个完全不同的实现。

如果一个不可变的地图适合你的需要,那么有一个名为番石榴的谷歌图书馆(另见番石榴的问题 )

Guava提供了一个具有可靠的用户指定迭代次序的ImmutableMap 。 这个ImmutableMap对containsKey,get有O(1)性能。 显然放和删除不支持。

ImmutableMap对象通过使用()和copyOf()或Builder对象的优雅静态便利方法来构造。

您可以维护一个Map (用于快速查找)和List (用于订单),但是LinkedHashMap可能是最简单的。 你也可以尝试一个SortedMap例如TreeMap ,它有你指定的任何顺序。

我不知道它是否是开源的,但经过一番search,我发现这个使用ArrayList的Map的实现 。 它似乎是1.5之前的Java,所以你可能想要泛化它,这应该很容易。 请注意,此实现具有O(N)访问权限,但是如果您不向数据库添加数百个小部件,那么这不应该成为问题,您不应该这样做。

你可以尝试我的链接树映射的实现。

当迭代遍历映射的keySet(),entrySet()或values()时,LinkedHashMap将按照插入映射的顺序返回元素。

 Map<String, String> map = new LinkedHashMap<String, String>(); map.put("id", "1"); map.put("name", "rohan"); map.put("age", "26"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } 

这将按照它们放入地图的顺序打印元素:

 id = 1 name = rohan age = 26 

每当我需要保持提前知道的事物的自然顺序,我使用EnumMap

键将枚举,你可以插入任何你想要的顺序,但是当你迭代它将迭代的枚举顺序(自然顺序)。

另外当使用EnumMap时,不应该有冲突,这可能会更有效率。

我真的发现,使用枚举映射干净的可读代码。 这是一个例子