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

2022-08-31 04:17:35

我正在寻找一个Java中的类,它具有键值关联,但不使用哈希。以下是我目前正在做的事情:

  1. 向 .Hashtable
  2. 获取 的迭代器。Hashtable.entrySet()
  3. 循环访问所有值和:
    1. 获取迭代器的 。Map.Entry
    2. 基于该值创建类型对象(自定义类)。Module
    3. 将类添加到 JPanel。
  4. 显示面板。

这样做的问题是,我无法控制我获取值的顺序,因此我无法按给定顺序显示值(不硬编码顺序)。

我会为此使用 or,但在代码的后面,我需要获取给定键的对象,我无法使用 or .ArrayListVectorModuleArrayListVector

有没有人知道一个免费/开源的Java类可以做到这一点,或者一种根据添加时间从中获取值的方法?Hashtable

谢谢!


答案 1

我建议使用LinkedHashMapTreeMap。A 保持键的插入顺序,而 a 则通过 元素的自然排序保持排序。LinkedHashMapTreeMapComparatorComparable

由于它不必对元素进行排序,因此在大多数情况下应该更快; 根据 Javadocs,具有 、 、 和 的性能,而 is 则适用于每个。LinkedHashMapTreeMapO(log n)containsKeygetputremoveLinkedHashMapO(1)

如果您的 API 只期望可预测的排序顺序,而不是特定的排序顺序,请考虑使用这两个类实现的接口,NavigableMapSortedMap。这将允许您不将特定实现泄漏到API中,并在之后随意切换到这些特定类或完全不同的实现。


答案 2

当您迭代映射的 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