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

Sha*_*ane 438 java dictionary key-value

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

  1. 添加值到a Hashtable.
  2. 获取一个迭代器Hashtable.entrySet().
  3. 迭代所有值并:
    1. 获取一个Map.Entry迭代器.
    2. Module根据值创建类型(自定义类)的对象.
    3. 将类添加到JPanel.
  4. 显示面板.

这个问题是我无法控制返回值的顺序,所以我不能以给定的顺序显示值(不对代码进行硬编码).

我会使用一个ArrayListVector为此,但稍后在代码中我需要抓取Module给定Key 的对象,我无法使用ArrayListVector.

有没有人知道一个可以执行此操作的免费/开源Java类,或者Hashtable根据添加时间来获取值的方法?

谢谢!

Mic*_*ers 693

我建议一个LinkedHashMap或一个TreeMap.A LinkedHashMap按照插入顺序保持键,而a TreeMap通过元素Comparator的自然Comparable顺序保持排序.

由于它不必保持元素排序,LinkedHashMap因此对于大多数情况应该更快; TreeMapO(log n)表现为containsKey,get,put,和remove,根据的Javadoc,而LinkedHashMapO(1)对每个.

如果您的API仅期望可预测的排序顺序,而不是特定的排序顺序,请考虑使用这两个类实现的接口,NavigableMapSortedMap.这将允许您不要将特定实现泄漏到API中,然后切换到这些特定类中的任何一个,或者随后切换到完全不同的实现.

  • 请注意:TreeMap的排序基于键的自然顺序:"地图根据其键的自然顺序排序".LinkedHashMap按照bij插入顺序排序.很大的区别! (57认同)
  • 我相信 `LinkedHashMap` 没有实现 `NavigableMap` 或 `SortedMap`。 (6认同)
  • 这对我不起作用,因为根据javadocs,这只给出了有序值(通过values()调用).有没有办法获得有序的Map.Entry实例? (2认同)
  • @AlexR:只有在使用[特殊构造函数](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html#LinkedHashMap-int-float -boolean-)就是为此目的而提供的。默认情况下,迭代按插入顺序进行。 (2认同)

Pra*_*hor 19

当您遍历地图的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());
}
Run Code Online (Sandbox Code Playgroud)

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

id = 1
name = rohan 
age = 26 
Run Code Online (Sandbox Code Playgroud)


jvd*_*ste 16

如果一个不可变的地图符合您的需求,那么谷歌有一个名为guava的库(另见番石榴问题)

GuavaImmutableMap提供了可靠的用户指定迭代顺序.这个ImmutableMap对containsKey,get有O(1)性能.显然不支持put和remove.

ImmutableMap对象是使用()copyOf()的优雅静态方便方法或Builder对象构造的.


小智 8

您可以使用LinkedHashMap在 Map 中主要插入顺序

Java LinkedHashMap 类的要点是:

  1. 它只包含独特的元素。

  2. LinkedHashMap 包含基于键的值。

  3. 它可能有一个空键和多个空值。

  4. 它与HashMap相同,只是维护插入顺序

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    
    Run Code Online (Sandbox Code Playgroud)

但是,如果您希望使用用户定义的对象或任何原始数据类型键对映射中的值进行排序,那么您应该使用TreeMap有关更多信息,请参阅此链接


Pet*_*rey 6

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