it-swarm.dev

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

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

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

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

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

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

谢谢!

407
Shane

我建议使用 LinkedHashMap 或a TreeMapLinkedHashMap按照插入顺序保存键,而TreeMap通过Comparator或元素的自然Comparable顺序保持排序。

由于它不必保持元素排序,因此LinkedHashMap在大多数情况下应该更快; TreeMap根据Javadocs对containsKeygetputremove具有O(log n)性能,而LinkedHashMap则为O(1)

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

651
Michael Myers

当您遍历地图的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 
15
Praveen Kishor

如果一个不可变的地图符合你的需要 那么谷歌有一个名为 guava的库 (参见 番石榴问题

Guava 提供 ImmutableMap 具有可靠的用户指定迭代顺序。这个 ImmutableMap hasO(1)表现为containsKey,get。显然不支持put和remove。

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

14
jvdneste

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

6
Peter Lawrey

您可以尝试我的 链接树图 实现。

1
Lawrence Dol

我不知道它是不是开源,但经过一番谷歌搜索后,我发现 使用ArrayList的这个Map实现 。它似乎是1.5之前的Java,所以你可能想要将它泛化,这应该很容易。请注意,此实现具有O(N) access,但如果您不向JPanel添加数百个小部件,则这不应该是一个问题,您不应该这样做。

1
jpalecek

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

键将是枚举,您可以按任何顺序插入,但迭代时将按枚举顺序(自然顺序)进行迭代。

此外,当使用EnumMap时,应该没有可能更有效的冲突。

我真的发现使用enumMap可以实现干净的可读代码。这是 示例

1
j2emanue

您可以使用 LinkedHashMap 来映射Map中的主插入顺序

关于Java LinkedHashMap类的重点是:

  1. 它只包含独特的元素。
  2. LinkedHashMap包含基于键3的值。它可以具有一个空键和多个空值。 4.它与HashMap相同,而是维护插入顺序

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

但是如果你想在地图中使用用户定义的对象或任何原始数据类型键来排序值,那么你应该使用 TreeMap 有关更多信息,请参阅 此链接

0
Pankaj Goyal