2015-07-20 21 views
3

我有一個LinkedHashMap,我有我的密鑰作爲ID,我試圖實現的是我能夠查找一個ID,如果它存在有一個迭代器從該條目到地圖的末尾。我已經試過到目前爲止從LinkedHashMap中的特定對象的迭代器

Map<String, Obj> map = new LinkedHashMap<>(); 
Iterator it = map.entrySet().iterator(); 

但是,有沒有辦法可以迭代器從一個特定的對象開始沒有做線性搜索,並找到它自己?

回答

0

不,這是不可能的LinkedHashMap。有一個方法tailMapNavigableMapNavigableMap接口可以幫助你做到這一點(map.tailMap(key).iterator()),但這個接口不是由LinkedHashMap實現如果TreeMap(可能與自定義比較器)是你的情況下適當的替代品,請考慮使用它。

+0

那麼我需要保持插入順序,我不確定TreeMap是否會這樣做?我正在閱讀它。 –

1

不,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)中刪除。

+0

這是我目前使用的解決方案,但當我在列表中間刪除時,我需要從該位置更新地圖!我經常編輯和刪除。我知道這聽起來像我要求太多,但確保沒有現成的解決方案。 –

+0

@AadiDroid好的,我沒有意識到這一點。請看我編輯的答案。 –