关于字典:实现映射和保持插入顺序的Java类?

Java Class that implements Map and keeps insertion order?

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

  • Hashtable添加值。
  • 获取Hashtable.entrySet()的迭代器。
  • 遍历所有值并:
  • 为迭代器获取一个Map.Entry
  • 基于值创建Module类型的对象(自定义类)。
  • 将类添加到jpanel。
  • 显示面板。
  • 问题在于,我无法控制返回值的顺序,因此无法按给定顺序显示值(无需对顺序进行硬编码)。

    我会用一个ArrayListVector来实现这个目的,但是在代码后面,我需要为一个给定的密钥获取Module对象,这是我不能用ArrayListVector做的。

    有人知道一个免费的/开源的Java类来实现这一点,还是一种基于EDCOX1的0值来获取值的方法?

    谢谢!


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

    由于不需要对元素进行排序,所以在大多数情况下,LinkedHashMap应该更快;根据javadocs,TreeMapcontainsKeygetputremove具有O(log n)的性能,而LinkedHashMap对每个都具有O(1)的性能。

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


    当您遍历映射的keyset()、entryset()或values()时,LinkedHashMap将按元素插入映射的顺序返回元素。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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());
    }

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

    1
    2
    3
    id = 1
    name = rohan
    age = 26


    如果一个不变的地图符合你的需要,那么谷歌有一个图书馆,叫做guava(另见guava问题)。

    guava提供了一个具有可靠的用户指定迭代顺序的不可变映射。对于containsKey、get,此不可变映射的性能为O(1)。显然,不支持放置和移除。

    不可变映射对象是通过使用()和copyof()优雅的静态便利方法或构建器对象来构建的。


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


    每当我需要保持提前知道的事物的自然顺序时,我使用一个枚举。

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

    同样,在使用Enummap时,不应该有更有效的冲突。

    我真的发现使用Enummap可以使代码清晰可读。下面是一个例子


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


    我不知道它是否是OpenSource,但在谷歌搜索了一下之后,我发现了使用arraylist实现映射的方法。它似乎是Prime1.5 Java,所以您可能想要概括它,这应该很容易。注意,这个实现有O(N)访问权,但是如果不向jpanel添加数百个小部件,这就不成问题了,无论如何都不应该这样。


    可以在映射中使用LinkedHashMap到主插入顺序

    关于JavaLink KHASMAP类的要点是:

  • 它只包含yunique元素。
  • LinkedHashMap包含基于键的值3.可以有一个空键和多个空值。4.与hashmap相同,维护插入顺序

    1
    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
  • 但是,如果希望使用用户定义的对象或任何基元数据类型键对映射中的值进行排序,则应使用treemap获取更多信息,请参阅此链接