我正在寻找一个具有键值关联的java类,但不使用哈希 . 这是我目前正在做的事情:
-
将值添加到
Hashtable
. -
获取
Hashtable.entrySet()
的迭代器 . -
迭代所有值并:
-
为迭代器获取
Map.Entry
. -
根据值创建
Module
类型的对象(自定义类) . -
将类添加到JPanel .
-
显示面板 .
这个问题是我无法控制返回值的顺序,因此我无法按给定的顺序显示值(不对代码进行硬编码) .
我会为此使用 ArrayList
或 Vector
,但稍后在代码中我需要为给定的Key获取 Module
对象,我无法使用 ArrayList
或 Vector
.
有没有人知道这样做的免费/开源Java类,或者根据添加它们的时间从 Hashtable
获取值的方法?
谢谢!
8 回答
你可以尝试我的Linked Tree Map实现 .
我建议LinkedHashMap或TreeMap .
LinkedHashMap
按照插入的顺序保持键,而TreeMap
通过Comparator
或元素的自然Comparable
顺序保持排序 .由于它不必保持元素排序,因此大多数情况下
LinkedHashMap
应该更快;根据Javadocs,TreeMap
的containsKey
,get
,put
和remove
的性能为O(log n)
,而LinkedHashMap
为每个O(1)
.如果您的API仅期望可预测的排序顺序(而不是特定的排序顺序),请考虑使用这两个类实现的接口,NavigableMap或SortedMap . 这将允许您不要将特定实现泄漏到API中,然后切换到这些特定类中的任何一个,或者随后切换到完全不同的实现 .
If an immutable map fits your needs 然后谷歌有一个名为guava的图书馆(另见guava questions)
Guava提供ImmutableMap,具有可靠的用户指定迭代顺序 . 这个ImmutableMap对于containsKey,get有O(1)性能 . 显然不支持put和remove .
ImmutableMap对象是使用优雅的静态便捷方法of()和copyOf()或Builder对象构造的 .
当您迭代 Map 的keySet(),entrySet()或values()时,LinkedHashMap将按照它们插入到 Map 中的顺序返回元素 .
这将按照放入 Map 的顺序打印元素:
您可以维护
Map
(用于快速查找)和List
(用于订购),但LinkedHashMap
可能是最简单的 . 您也可以试试SortedMap
例如TreeMap
,其中包含您指定的任何订单 .我不知道它是不是开源,但经过一番谷歌搜索后,我找到了this implementation of Map using ArrayList . 它似乎是1.5之前的Java,所以你可能想要将它泛化,这应该很容易 . 请注意,此实现具有O(N)访问权限,但这不应该为您的JPanel添加数百个小部件,无论如何您都不应该这样做 .
每当我需要保持提前知道的事物的自然顺序时,我会使用EnumMap
键将是枚举,您可以按任何顺序插入,但在迭代时,它将按枚举顺序(自然顺序)进行迭代 .
此外,当使用EnumMap时,应该没有可能更有效的冲突 .
我真的发现使用enumMap可以实现干净的可读代码 . 这是example
您可以在Map中使用 LinkedHashMap 到主插入顺序
关于Java LinkedHashMap类的重点是:
它只包含唯一的元素 .
LinkedHashMap包含基于键3的值 . 它可能有一个空键和多个空值 . 4.它与HashMap相同,而不是维护插入顺序
但是如果你想使用用户定义的对象或任何原始数据类型键在 Map 中排序值,那么你应该使用 TreeMap 更多信息,请参考this link