2017-08-24 85 views
5

我有一個Map。TreeMap iterator.remove()修改最後一個條目

Map<Integer,String> map = ... 

該變換圖具有n個元素(讓對本示例中,這些9)

map.put(1,"one"); 
    map.put(2,"two"); 
    map.put(3,"three"); 
    map.put(4,"four"); 
    map.put(5,"five"); 
    map.put(6,"six"); 
    map.put(7,"seven"); 
    map.put(8,"eigth"); 
    map.put(9,"nine"); 

現在我想遍歷這個地圖,並且使用迭代除去第n個元件。

private void remove(int num, final Map<Integer, String> map) { 

    Iterator<Map.Entry<Integer,String>> it = map.entrySet().iterator(); 
    Map.Entry<Integer,String> entry; 
    while(it.hasNext()){ 

    entry = it.next(); 

    if(Integer.valueOf(num).equals(entry.getKey())){ 
     it.remove(); 
     System.out.println(entry.getValue()); 
     // vs 
     // System.out.println(entry.getValue()); 
     // it.remove(); 
    } 
    } 
} 

從javadoc,我假設,刪除的語義是明確的。

但根據地圖的實現 - 即HashMap的VS TreeMap的是有差別是否it.remove()entry.getValue()後或做過

爲包含HashMap map = new HashMap<>()行爲是

... 
remove(4, map); //output: four 
//or 
remove(5, map); //output: five 

爲TreeMap的map = new TreeMap<>()的行爲是一樣的,當我後移除迭代器當前條目我曾訪問過它:

System.out.println(entry.getValue()); 
it.remove(); 

結果在

remove(4, map); //output: four 
//or 
remove(5, map); //output: five 

到目前爲止好,但如果我之前刪除元素我訪問入口:

it.remove(); 
System.out.println(entry.getValue()); 

輸出是意外

remove(4, map); //output: five !!! 
//or 
remove(5, map); //output: five ok 

顯然,TreeMapit.remove()修改Entries,因爲TreeMapEntries組成,迭代器實際返回地圖的實際元素。取決於樹中的當前位置,入口點的內部引用指向下一個或當前(已刪除)元素。

但我不確定這是一個錯誤還是這是故意的。如果後者是這種情況,我想知道背後的理由嗎?

編輯:的TreeMap iterator.remove()

+0

我不明白你在任何一個地圖中描述的行爲......你使用的是什麼Java版本?如果在remove()之前和之後輸出條目的值會發生什麼? – daniu

+0

jdk1.8.0_121 ...它可以用只有3個條目的TreeMap(1,2,3)重現,刪除中間元素(2)。但它沒有出現在HashMap –

+0

之前和之後打印出來的結果是「兩個,三個」 –

回答