簡體   English   中英

如何對Java Hashtable進行排序?

[英]How to sort a Java 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()
    );
}

如果您想要一個保留訂單的地圖,您應該使用LinkedHashMap

Map接口的哈希表和鏈表實現,具有可預測的迭代順序。 此實現與HashMap的不同之處在於它維護了一個貫穿其所有條目的雙向鏈表。 此鏈接列表定義迭代排序,通常是鍵插入映射的順序(插入順序)。 請注意,如果將鍵重新插入地圖,則插入順序不會受到影響。 (A鍵k被重新插入到地圖m如果m.put(k, v)被調用時m.containsKey(k)將在調用之前立即返回true。)

此實現使其客戶端免受HashMap (和Hashtable )提供的未指定的,通常混亂的排序,而不會導致與TreeMap相關的成本增加。

請注意,這通常與HashMap而不是Hashtable - 我不知道保留的順序等同於Hashtable ; 這些天通常不會使用后者(正如ArrayList通常優先使用Vector )。

我假設你想要插入順序而不是按鍵排序的順序。 如果您想要后者,請使用TreeMap

雖然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);
}

會沒事的。

Hashtable沒有可預測的迭代順序,無法排序。 如果您只想要可預測的迭代順序,則應使用LinkedHashMap 如果您希望能夠對Map進行排序,則應使用TreeMap

使用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);

Hashtable是一個遺留的集合,在1998年被Java 1.2集合取代。我建議你避免它,以及VectorEnumeration

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

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

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

如果我從哈希表中讀取數據,它的輸入順序與我插入的順序不同。

你的問題沒有意義。 Hashtable沒有“訂單”,它是無序的(編輯:某些實現確實有一個訂單,但它不常見於哈希表)。

你期望參賽作品的順序是什么?

如果要按特定順序存儲元素,則需要使用列表(例如java.util.List的子類)。

而順便說一句,您的代碼示例甚至不包含哈希表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM