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
顯然,TreeMap
的it.remove()
修改Entries
,因爲TreeMap
由Entries
組成,迭代器實際返回地圖的實際元素。取決於樹中的當前位置,入口點的內部引用指向下一個或當前(已刪除)元素。
但我不確定這是一個錯誤還是這是故意的。如果後者是這種情況,我想知道背後的理由嗎?
我不明白你在任何一個地圖中描述的行爲......你使用的是什麼Java版本?如果在remove()之前和之後輸出條目的值會發生什麼? – daniu
jdk1.8.0_121 ...它可以用只有3個條目的TreeMap(1,2,3)重現,刪除中間元素(2)。但它沒有出現在HashMap –
之前和之後打印出來的結果是「兩個,三個」 –