首页 文章

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

提问于
浏览
385

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

  • 将值添加到 Hashtable .

  • 获取 Hashtable.entrySet() 的迭代器 .

  • 迭代所有值并:

  • 为迭代器获取 Map.Entry .

  • 根据值创建 Module 类型的对象(自定义类) .

  • 将类添加到JPanel .

  • 显示面板 .

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

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

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

谢谢!

8 回答

  • 0

    你可以尝试我的Linked Tree Map实现 .

  • 625

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

    由于它不必保持元素排序,因此大多数情况下 LinkedHashMap 应该更快;根据Javadocs, TreeMapcontainsKeygetputremove 的性能为 O(log n) ,而 LinkedHashMap 为每个 O(1) .

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

  • 9

    If an immutable map fits your needs 然后谷歌有一个名为guava的图书馆(另见guava questions

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

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

  • 6

    当您迭代 Map 的keySet(),entrySet()或values()时,LinkedHashMap将按照它们插入到 Map 中的顺序返回元素 .

    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());
    }
    

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

    id = 1
    name = rohan 
    age = 26
    
  • 13

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

  • 1

    我不知道它是不是开源,但经过一番谷歌搜索后,我找到了this implementation of Map using ArrayList . 它似乎是1.5之前的Java,所以你可能想要将它泛化,这应该很容易 . 请注意,此实现具有O(N)访问权限,但这不应该为您的JPanel添加数百个小部件,无论如何您都不应该这样做 .

  • 1

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

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

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

    我真的发现使用enumMap可以实现干净的可读代码 . 这是example

  • 1

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

    关于Java LinkedHashMap类的重点是:

    • 它只包含唯一的元素 .

    • LinkedHashMap包含基于键3的值 . 它可能有一个空键和多个空值 . 4.它与HashMap相同,而不是维护插入顺序

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

    但是如果你想使用用户定义的对象或任何原始数据类型键在 Map 中排序值,那么你应该使用 TreeMap 更多信息,请参考this link

相关问题