从TreeMap中删除条目,获取java.util.NoSuchElementException

时间:2014-08-01 07:20:17

标签: java iterator treemap

我试图使用一些逻辑从TreeMap中删除一些条目。这是我的代码

TreeMap<String, Object> treeMap = someEntries();
Iterator<Entry<String, Object> iter = treeMap.entrySet().iterator();
Map.Entry<String, Object> entry = null;

while ((entry = iter.next()) != null) {
    if (!entry.getKey().contains(search)) {
        iter.remove();
    }
}

获得例外: -

java.util.NoSuchElementException
    at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1113)
    at java.util.TreeMap$EntryIterator.next(TreeMap.java:1151)
    at java.util.TreeMap$EntryIterator.next(TreeMap.java:1146)

那是什么例外?这是迭代期间的错误。还请建议我正确的方式。

3 个答案:

答案 0 :(得分:1)

您应该使用Iterator#hasNext()而不是Iterator#next()进行核对:

while (iter.hasNext()) {
    entry = iter.next();
    if (!entry.getKey().contains(search)) {
        iter.remove();
    }
}

答案 1 :(得分:1)

您应该检查下一个元素:

    TreeMap<String, Object> treeMap = someEntries();
    Iterator<Entry<String, Object>> iter = treeMap.entrySet().iterator();
    Entry<String, Object> entry;
    while (iter.hasNext()) {
        entry = iter.next();
        if (!entry.getKey().contains(search)) {
            iter.remove();
        }
    }

如果您在没有下一个元素时致电iter.next(),则NoSuchElementException会被抛出。

答案 2 :(得分:0)

当您遍历最后一个元素时,&#39; next&#39; point为NULL,因此当你走到最后时,你将得到NoSuchElementException。 使用以下代码进行尝试:

TreeMap<String, Object> treeMap = new TreeMap<String, Object>();
treeMap.put("a", 1);
treeMap.put("b", 2);
treeMap.put("c", 3);
treeMap.put("d", 4);
Iterator<Entry<String, Object>> iter = treeMap.entrySet().iterator();
Map.Entry<String, Object> entry = null;

while (iter.hasNext()) {
    entry = iter.next();
    System.out.println(entry.getKey());
    if (!entry.getKey().contains("a")) {
           iter.remove();
    }
}

System.out.println("-----");
iter = treeMap.entrySet().iterator();
while (iter.hasNext()) {
    entry = iter.next();
    System.out.println(entry.getKey());
}