如何實現key, value有序的HashMap?
想要寫個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逆序輸出
得到結果
Key逆序輸出
得到結果
[b]現在存在的問題:[/b]
1.HashMap的key, value都是object,而我現在只想比較數值型別的key或value的物件。對於所有數值型,怎麼做個通用的比較方法呢?(我先把它們轉成Number類,再強制轉成double型別進行比較,總覺的這種方法很山寨)。
2.物件多的時候,插入很慢的。它要從連結串列頭一個接一個的比較物件,速度奇慢無比,怎麼能優化下呢?(網上找“查詢有序連結串列”時,都是那個key等於key或value,而我現在想要的不是“等於”而是“接近”,也就是如何生成一個有序連結串列)
[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,而我現在想要的不是“等於”而是“接近”,也就是如何生成一個有序連結串列)
相關文章
- Hashtable/HashMap與key/value為null的關係HashMapNull
- HashMap的實現原理 HashMap底層實現,hashCode如何對應bucket?HashMap
- 為 Key-Value 資料庫實現MVCC 事務資料庫MVC
- HashMap的實現原理HashMap
- 用實數作為 HashMap 的key,被坑哭了HashMap
- 簡單的 HashMap 實現HashMap
- HashMap實現原理HashMap
- redis的有序集的實現原理Redis
- 一個 key 能儲存多個 value 的 map --- 自定義的 MultiValueMap,實現 Map 介面
- Java交換map的key和value值Java
- Java中HashMap的實現原理JavaHashMap
- python 實現有序字典Python
- RESTOREkeyttlserialized-value[REPLACE]RESTTLSZed
- redis有序集合實現實時排名Redis
- hashmap與hashtable的區別,以及實現hashmap的同步操作HashMap
- HashMap的內部實現機制HashMap
- Java HashMap 的實現原理詳解JavaHashMap
- HashMap底層實現原理HashMap
- HashMap原始碼實現分析HashMap原始碼
- hashmap實現原理淺析HashMap
- iOS的高效能、高實時性key-value持久化元件iOS持久化元件
- java中Map根據Map的value取keyJava
- leveldb:新的快速key-value 儲存庫
- 對HashMap的思考及手寫實現HashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- 帶你逐步實現簡易HashMap,助力理解Java HashMapHashMapJava
- Laravel 框架加密解密如何實現 key 值多變的需求Laravel框架加密解密
- JavaMap通過key或者value過濾Java
- Map按照key和value進行排序排序
- Python dict sort排序 按照key,valuePython排序
- Lab 4: Fault-tolerant Key/Value Service
- JDK1.8中HashMap實現JDKHashMap
- Java HashMap工作原理及實現JavaHashMap
- 使用Redis的有序集合實現排行榜功能Redis
- Rust實現hotkeyRust
- 深入理解Java中的HashMap的實現原理JavaHashMap
- c# 對JSON字串排序(KEY/VALUE)C#JSON字串排序
- Keycloak中授權的實現