如何对Java Hashtable进行排序?

时间:2010-12-02 09:04:46

标签: java sorting maps hashtable

我将一些数据插入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()
    );
}

7 个答案:

答案 0 :(得分:22)

如果您需要保留订单的地图,则应使用LinkedHashMap

  

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

     

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

请注意,这通常与HashMap而不是Hashtable进行比较 - 我不知道保留的订单等同于Hashtable;这些天通常不会使用后者(正如ArrayList通常优先使用Vector)。

我假设你想要插入订单而不是按键排序订单。如果您想要后者,请使用TreeMap

答案 1 :(得分:7)

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

答案 2 :(得分:7)

虽然无法对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);
}

会好的。

答案 3 :(得分: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);

答案 4 :(得分:3)

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

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

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

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

答案 5 :(得分:0)

  

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

你的问题没有意义。 Hashtable没有“订单”,它是无序的(编辑:有些实现确实有订单,但它对于哈希表来说并不常见)..

您希望条目以什么顺序出现?

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

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

答案 6 :(得分:0)