我在寻找一个Java类,它具有键值关联,但不使用哈希。以下是我目前正在做的工作:
向Hashtable添加值。
获取Hashtable.entrySet()的迭代器。
遍历所有值并:
为迭代器获取一个Map.Entry。
基于值创建Module类型的对象(自定义类)。
将类添加到jpanel。
显示面板。
问题在于,我无法控制返回值的顺序,因此无法按给定顺序显示值(无需对顺序进行硬编码)。
我会用一个ArrayList或Vector来实现这个目的,但是在代码后面,我需要为一个给定的密钥获取Module对象,这是我不能用ArrayList或Vector做的。
有人知道一个免费的/开源的Java类来实现这一点,还是一种基于EDCOX1的0值来获取值的方法?
谢谢!
- 您不需要使用entryset/map.entry。可以使用hashtable.keys作为枚举或使用hashtable.keyset.iterator对键和值进行迭代。
- 我自由地更改了标题,因为不使用哈希实际上不是问题,而是保持插入顺序。
我建议使用LinkedHashMap或TreeMap。LinkedHashMap按照插入键的顺序保存键,而TreeMap通过Comparator或元素的自然Comparable顺序保存键。
由于不需要对元素进行排序,所以在大多数情况下,LinkedHashMap应该更快;根据javadocs,TreeMap对containsKey、get、put和remove具有O(log n)的性能,而LinkedHashMap对每个都具有O(1)的性能。
如果您的API只期望一个可预测的排序顺序,而不是特定的排序顺序,那么考虑使用这两个类实现的接口:NavigableMap或SortedMap。这将允许您不将特定的实现泄漏到API中,然后随意切换到这些特定的类或完全不同的实现。
- 这对我来说不起作用,因为根据javadocs,这只提供有序的值(通过values()调用)。有没有办法获得有序的map.entry实例?
- @柯林德尔:Treemap不工作吗?它应该按键排序,而不是按值排序。
- 我的错,我以为布景没有排序。
- @科克恩德尔:他们可以,但并不总是。
- 请注意:Treemap的排序基于键的自然顺序:"地图按照键的自然顺序排序"。Linkedhashmap是按bij插入顺序排序的。大不同!
- 我认为LinkedHashMap不执行NavigableMap或SortedMap。
- Linkedhashmap按上次访问的顺序保存密钥,而不是"插入"。当你不想这样做的时候会很恼人。
- @Alexr:只有在Linkedhashmap是使用为此目的提供的特殊构造函数创建的情况下,这才是正确的。默认情况下,迭代是按插入顺序进行的。
当您遍历映射的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获取更多信息,请参阅此链接