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

向哈希表中添加值。 获取Hashtable.entrySet()的迭代器。 遍历所有值,并: 弄张地图。迭代器的入口。 根据值创建一个Module类型的对象(自定义类)。 将类添加到JPanel中。 显示面板。

这样做的问题是,我无法控制返回值的顺序,因此不能以给定的顺序显示值(没有对顺序进行硬编码)。

我将使用一个数组列表或Vector来实现这一点,但在代码的后面,我需要为给定的Key获取Module对象,这是我不能用数组列表或Vector来实现的。

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

谢谢!


当前回答

我建议使用LinkedHashMap或TreeMap。LinkedHashMap按插入键的顺序保存键,而TreeMap则通过Comparator或键的自然可比顺序保持排序。

因为它不需要保持元素排序,LinkedHashMap在大多数情况下应该更快;根据Javadocs, TreeMap对于containsKey、get、put和remove的性能为O(log n),而LinkedHashMap则为O(1)。

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

其他回答

我建议使用LinkedHashMap或TreeMap。LinkedHashMap按插入键的顺序保存键,而TreeMap则通过Comparator或键的自然可比顺序保持排序。

因为它不需要保持元素排序,LinkedHashMap在大多数情况下应该更快;根据Javadocs, TreeMap对于containsKey、get、put和remove的性能为O(log n),而LinkedHashMap则为O(1)。

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

每当我需要维护事物的自然顺序,我使用一个EnumMap提前知道

键将是枚举,你可以插入任何你想要的顺序,但当你迭代它将迭代在枚举顺序(自然顺序)。

此外,在使用EnumMap时,不应该有碰撞,这可以更有效。

我真的发现使用enumMap可以生成清晰可读的代码。 这里有一个例子

如果一个不可变映射符合您的需求,那么谷歌有一个名为guava的库(参见guava问题)

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

ImmutableMap对象是通过使用优雅的静态方便方法()和copyOf()或Builder对象来构造的。

当你遍历映射的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());
}

这将按元素放入map中的顺序打印它们:

id = 1
name = rohan 
age = 26 

我不知道它是否是开源的,但在谷歌了一下之后,我发现了这个使用数组列表的Map实现。它似乎是1.5之前的Java,所以您可能想要泛化它,这应该很容易。注意,这个实现有O(N)访问权限,但如果您没有向JPanel添加数百个小部件,这应该不是问题,无论如何也不应该这样做。