如何对 Java Hashtable 进行排序?

Posted

技术标签:

【中文标题】如何对 Java Hashtable 进行排序?【英文标题】:How to sort a Java Hashtable? 【发布时间】:2011-05-19 00:14:19 【问题描述】:

我在 Java Hashtable 中插入了一些数据。如果我从 Hashtable 中读取数据,它不会按照我插入的顺序返回。如何从 Hashtable 中获取有序数据?

我使用以下代码从哈希表中获取值:

// Get a set of the entries
Set set = hsUpdateValues.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while (i.hasNext()) 
    Map.Entry me = (Map.Entry) i.next();            
    System.out.print(
        "Key : " + me.getKey()
        + ", Value: " + me.getValue()
    );

【问题讨论】:

不要使用向量、枚举或哈希表。它们很古老,应该避免。信息:***.com/questions/453684/…***.com/questions/2601602/…***.com/questions/2873254/… 【参考方案1】:

如果你想要一个保序映射,你应该使用LinkedHashMap:

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。 (如果 m.put(k, v) 被调用,而 m.containsKey(k) 将在调用之前立即返回 true,则键 k 将重新插入映射 m。)

此实现使其客户免受HashMap(和Hashtable)提供的未指定、通常混乱的排序,而不会增加与TreeMap相关的成本。

请注意,这通常与HashMap 进行比较,而不是Hashtable - 我不知道与Hashtable 等效的订单保留;无论如何,后者现在通常不被使用(就像 ArrayList 通常优先使用 Vector)。

我假设你想要 insertion 顺序而不是 key-sorted 顺序。如果你想要后者,请使用TreeMap

【讨论】:

@Tester:如果你觉得可以的话,你可能想“接受”一个答案:)【参考方案2】:

如果我从哈希表中读取数据 它的顺序不同 我插入了。

你的问题没有意义。哈希表没有“顺序”,它是无序的(编辑:某些实现确实有顺序,但哈希表并不常见)..

您希望条目的顺序是什么?

如果要按一定顺序存储元素,则需要使用列表(例如 java.util.List 的子类)。

顺便说一句,您的代码示例甚至不包含哈希表。

【讨论】:

【参考方案3】:

使用 TreeMap 对其进行排序:

Map<String, String> yourMap = new HashMap<String, String>();
    yourMap.put("1", "one");
    yourMap.put("2", "two");
    yourMap.put("3", "three");

Map<String, String> sortedMap = new TreeMap<String, String>(yourMap);

【讨论】:

那不会给 insertion 订单。【参考方案4】:

Hashtable 没有可预测的迭代顺序,无法排序。如果您只想要可预测的迭代顺序,您应该使用LinkedHashMap。如果您希望能够对您的Map 进行排序,您应该使用TreeMap

【讨论】:

【参考方案5】:

Hashtable 是一个遗留集合,在 1998 年被 Java 1.2 集合取代。我建议您避免使用它,以及 VectorEnumeration

尽可能使用HashMap,而不是Hashtable。如果需要,您可以使用 Collections.synchronizedMap(map) 添加同步。

尽可能使用ArrayList,而不是Vector。如果需要,您可以使用Collections.synchronizedList(map) 添加同步。

您可以使用Iterator 甚至for-each 循环来代替Enumeration

【讨论】:

你会用什么代替? 例子可以在link找到【参考方案6】:

虽然Hashtable 无法排序,但他询问如何获取排序数据,这可以通过对从HashTable 中提取的键列表进行排序并按该顺序检索值来完成。 比如:

List<'your_type'> tmp = Collections.list('your_hashtable'.keys());
Collections.sort(tmp);
Iterator<'your_type'> it = tmp.iterator();

while(it.hasNext())
    'your_type' element =it.next();
    //here you can get ordered things: 'your_hashtable'.get(element);

会好的。

【讨论】:

以上是关于如何对 Java Hashtable 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HashTable 对文件组进行排序 - Visual Basic

Hashtable一个键多个值 在遍历怎么做啊

java如何对map进行排序详解(map集合的使用)

Java常见面试题分享

java8新特性:对map集合排序

如何使用SAS中的数据步骤对数据进行排序