实现Map并保持插入顺序的Java类?
-
22-08-2019 - |
题
我正在java中寻找一个具有键值关联但不使用哈希的类。这是我目前正在做的事情:
- 将值添加到
Hashtable
. - 获取一个迭代器
Hashtable.entrySet()
. - 迭代所有值并:
- 得到
Map.Entry
对于迭代器。 - 创建类型的对象
Module
(自定义类)基于值。 - 将类添加到 JPanel。
- 得到
- 显示面板。
问题是我无法控制取回值的顺序,因此我无法按给定顺序显示值(无需对顺序进行硬编码)。
我会用一个 ArrayList
或者 Vector
为此,但稍后在代码中我需要抓住 Module
给定 Key 的对象,我不能用 ArrayList
或者 Vector
.
有谁知道有一个免费/开源的 Java 类可以做到这一点,或者从 a 中获取值的方法 Hashtable
基于它们添加的时间?
谢谢!
解决方案
我建议一个 LinkedHashMap
或一个 TreeMap
. 。A LinkedHashMap
保持按键插入的顺序,同时 TreeMap
通过a保持排序 Comparator
或自然的 Comparable
元素的排序。
由于它不必保持元素排序, LinkedHashMap
大多数情况下应该更快; TreeMap
有 O(log n)
性能为 containsKey
, get
, put
, , 和 remove
, ,根据 Javadocs,同时 LinkedHashMap
是 O(1)
对于每个。
如果您的 API 仅需要可预测的排序顺序,而不是特定的排序顺序,请考虑使用这两个类实现的接口, NavigableMap
或者 SortedMap
. 。这将使您不会将特定的实现泄漏到您的 API 中,并在之后随意切换到这些特定的类或完全不同的实现。
其他提示
当您迭代映射的 keySet()、entrySet() 或 value() 时,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
您可以维护一个 Map
(用于快速查找)和 List
(用于订购)但是 LinkedHashMap
可能是最简单的。您还可以尝试 SortedMap
例如 TreeMap
, ,其中有您指定的任何顺序。
我不知道它是否是开源的,但经过一番谷歌搜索后,我发现 使用 ArrayList 实现 Map. 。它似乎是 1.5 之前的 Java,因此您可能想要对其进行通用化,这应该很容易。请注意,此实现具有 O(N) 访问权限,但如果您不向 JPanel 添加数百个小部件(无论如何您都不应该这样做),那么这应该不是问题。
你可以试试我的 链接树图 执行。
您可以使用 链接哈希映射 映射中的主要插入顺序
Java LinkedHashMap 类的要点是:
- 它只包含独特的元素。
LinkedHashMap包含基于密钥3的值。3可能具有一个空键和多个空值。4.和HashMap一样,只是维护插入顺序
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
但是,如果您希望使用用户定义的对象或任何原始数据类型键对映射中的值进行排序,那么您应该使用 树形图 欲了解更多信息,请参阅 这个链接