如何實現key, value有序的HashMap?

iteye_9550發表於2009-05-22
想要寫個key, value有序的HashMap,出現效能問題,大家幫忙給個主意吧。

[b]先說下我的設計思路:[/b]

LinkedHashMap裡面有一個模擬的“雙向迴圈連結串列”,用來儲存entry的插入順序,我也可以採用這種方法來在插入的時候儲存key和value的有序。

這裡暫定名為OrderedHashMap,主要程式碼是從LinkedHashMap抄過來的,它也維護著兩個模擬“雙向迴圈連結串列”:keyHeader和valueHeader,保持key或value由小到大的順序。當有個元素put進來後,除把它存在雜湊桶中外,還要在keyHeader按key的大小插入,也要在valueHeader上按value的順序插入。

想要輸出的話,可以從這兩個“頭指標”向前或向後來迭代得到key或value有序的entry。
(可以實現key和value,正序逆序的輸出,只對數值型比較,如果不是數值型的話,如HashMap般正常處理)
下面是測試結果:

Value逆序輸出
 OrderHashMap<Object, Object> map = new OrderHashMap<Object, Object>();
map.put(8, 1);
map.put(9, "value");
map.put(5, 6);
map.put("key", 9);

Iterator<Map.Entry<Object, Object>> it = map.valueDescendIterator();
while (it.hasNext()) {
Map.Entry<Object, Object> key = it.next();
System.out.println(key.getKey() + " " + key.getValue());
}


得到結果
key   9
5 6
8 1


Key逆序輸出
OrderHashMap<Object, Object> map = new OrderHashMap<Object, Object>();
map.put(8, 1);
map.put(9, "value");
map.put(5, 6);
map.put("key", 9);

Iterator<Map.Entry<Object, Object>> it = map.keyDescendIterator();
while (it.hasNext()) {
Map.Entry<Object, Object> key = it.next();
System.out.println(key.getKey() + " " + key.getValue());
}

得到結果
9   value
8 1
5 6



[b]現在存在的問題:[/b]

1.HashMap的key, value都是object,而我現在只想比較數值型別的key或value的物件。對於所有數值型,怎麼做個通用的比較方法呢?(我先把它們轉成Number類,再強制轉成double型別進行比較,總覺的這種方法很山寨)。


2.物件多的時候,插入很慢的。它要從連結串列頭一個接一個的比較物件,速度奇慢無比,怎麼能優化下呢?(網上找“查詢有序連結串列”時,都是那個key等於key或value,而我現在想要的不是“等於”而是“接近”,也就是如何生成一個有序連結串列)

相關文章