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

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

问题是我无法控制取回值的顺序,因此我无法按给定顺序显示值(无需对顺序进行硬编码)。

我会用一个 ArrayList 或者 Vector 为此,但稍后在代码中我需要抓住 Module 给定 Key 的对象,我不能用 ArrayList 或者 Vector.

有谁知道有一个免费/开源的 Java 类可以做到这一点,或者从 a 中获取值的方法 Hashtable 基于它们添加的时间?

谢谢!

有帮助吗?

解决方案

我建议一个 LinkedHashMap 或一个 TreeMap. 。A LinkedHashMap 保持按键插入的顺序,同时 TreeMap 通过a保持排序 Comparator 或自然的 Comparable 元素的排序。

由于它不必保持元素排序, LinkedHashMap 大多数情况下应该更快; TreeMapO(log n) 性能为 containsKey, get, put, , 和 remove, ,根据 Javadocs,同时 LinkedHashMapO(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 

如果不可变的地图满足您的需求 然后谷歌有一个名为的库 番石榴 (也可以看看 番石榴问题)

番石榴 提供了一个 不可变映射 具有可靠的用户指定的迭代顺序。这 不可变映射 containsKey、get 的性能为 O(1)。显然不支持放置和删除。

不可变映射 对象是通过使用优雅的静态便捷方法来构造的 的()备份() 或一个 建设者 目的。

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

我不知道它是否是开源的,但经过一番谷歌搜索后,我发现 使用 ArrayList 实现 Map. 。它似乎是 1.5 之前的 Java,因此您可能想要对其进行通用化,这应该很容易。请注意,此实现具有 O(N) 访问权限,但如果您不向 JPanel 添加数百个小部件(无论如何您都不应该这样做),那么这应该不是问题。

你可以试试我的 链接树图 执行。

每当我需要维护提前知道的事物的自然顺序时,我都会使用 枚举映射

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

此外,当使用 EnumMap 时,不应发生冲突,这样会更有效。

我确实发现使用 enumMap 可以生成干净可读的代码。这是一个 例子

您可以使用 链接哈希映射 映射中的主要插入顺序

Java LinkedHashMap 类的要点是:

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

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

但是,如果您希望使用用户定义的对象或任何原始数据类型键对映射中的值进行排序,那么您应该使用 树形图 欲了解更多信息,请参阅 这个链接

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top