我有一個LinkedHashMap,我有我的密鑰作爲ID,我試圖實現的是我能夠查找一個ID,如果它存在有一個迭代器從該條目到地圖的末尾。我已經試過到目前爲止從LinkedHashMap中的特定對象的迭代器
Map<String, Obj> map = new LinkedHashMap<>();
Iterator it = map.entrySet().iterator();
但是,有沒有辦法可以迭代器從一個特定的對象開始沒有做線性搜索,並找到它自己?
我有一個LinkedHashMap,我有我的密鑰作爲ID,我試圖實現的是我能夠查找一個ID,如果它存在有一個迭代器從該條目到地圖的末尾。我已經試過到目前爲止從LinkedHashMap中的特定對象的迭代器
Map<String, Obj> map = new LinkedHashMap<>();
Iterator it = map.entrySet().iterator();
但是,有沒有辦法可以迭代器從一個特定的對象開始沒有做線性搜索,並找到它自己?
不,這是不可能的LinkedHashMap
。有一個方法tailMap
在NavigableMap
NavigableMap
接口可以幫助你做到這一點(map.tailMap(key).iterator()
),但這個接口不是由LinkedHashMap
實現如果TreeMap
(可能與自定義比較器)是你的情況下適當的替代品,請考慮使用它。
不,LinkedHashMap
沒有這樣的功能。
但你只能在一個穿越的成本與List
模擬它:
Map<String, Object> map = new LinkedHashMap<>();
Map<String, Integer> indexesMap = new HashMap<>(map.size());
int index = 0;
for (String key : map.keySet()) {
indexesMap.put(key, index++);
}
List<Entry<String, Object>> entries = new ArrayList<>(map.entrySet());
// ...
String key = ...
Iterator<Entry<String, Object>> iterator = entries.listIterator(indexesMap.get(key));
論entries.listIterator
每個後續調用,您將獲得與O(1)複雜的迭代器。
編輯
如果你也想清除是O(1),那麼你不應該使用LinkedHashMap
。
您可以實現自己的雙向鏈表並將其節點存儲在HashMap
中。然後通過地圖上的鍵搜索節點。獲取節點時,您可以遍歷鏈表中其餘的後續條目,也可以通過從映射和鏈接列表中刪除,將其從O(1)中刪除。
這是我目前使用的解決方案,但當我在列表中間刪除時,我需要從該位置更新地圖!我經常編輯和刪除。我知道這聽起來像我要求太多,但確保沒有現成的解決方案。 –
@AadiDroid好的,我沒有意識到這一點。請看我編輯的答案。 –
那麼我需要保持插入順序,我不確定TreeMap是否會這樣做?我正在閱讀它。 –