如何實現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,而我現在想要的不是“等於”而是“接近”,也就是如何生成一個有序連結串列)
相關文章
- hashMap 中key和value互換HashMap
- Hashtable/HashMap與key/value為null的關係HashMapNull
- HashMap的實現原理 HashMap底層實現,hashCode如何對應bucket?HashMap
- 用實數作為 HashMap 的key,被坑哭了HashMap
- 一個 key 能儲存多個 value 的 map --- 自定義的 MultiValueMap,實現 Map 介面
- Java交換map的key和value值Java
- 簡單的 HashMap 實現HashMap
- redis的有序集的實現原理Redis
- iOS的高效能、高實時性key-value持久化元件iOS持久化元件
- c# 對JSON字串排序(KEY/VALUE)C#JSON字串排序
- JavaMap通過key或者value過濾Java
- Lab 4: Fault-tolerant Key/Value Service
- Java中HashMap的實現原理JavaHashMap
- Laravel 框架加密解密如何實現 key 值多變的需求Laravel框架加密解密
- Dynamo: Amazon’s Highly Available Key-value StoreAI
- redis有序集合實現實時排名Redis
- 關於HashMap的key重寫hashcode和equals的理解HashMap
- iOS-新手常見錯誤:this class is not key value coding-compliant for the key xxiOS
- 一個小巧而強大的 Key-Value 管理框架框架
- 取出字典中value最大值對應的key
- 往物件陣列裡面新增相同的key 不同的value物件陣列
- HashMap底層實現原理HashMap
- HashMap原始碼實現分析HashMap原始碼
- iCloud開發: key-value Storage,CloudKit,iCloud DocumentsCloud
- 對HashMap的思考及手寫實現HashMap
- Godown—Go開發的分散式Key-Value資料庫Go分散式資料庫
- 帶你逐步實現簡易HashMap,助力理解Java HashMapHashMapJava
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- NEL釋出NEO Key-Value資料庫LightDB資料庫
- Spring-MultiValueMap(一個Key對應多個Value)Spring
- LightKV-高效能key-value儲存元件元件
- Flutter持久化儲存之key-value儲存Flutter持久化
- 根據key集合批次從map中獲取value
- HashMap設計原理與實現(下篇)200行帶你寫自己的HashMap!!!HashMap
- 使用Redis的有序集合實現排行榜功能Redis
- alibaba fastjson的JsonObject有序的實現和原始碼分析ASTJSONObject原始碼
- Redis 檢視所有 key 的 value 值所佔記憶體大小Redis記憶體
- 給請求追加自定義值 $request->offsetSet ($key,$value)
- HotRing: A Hotspot-Aware In-Memory Key-Value Store(FAST ’20)HotSpotAST