繁体   English   中英

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

[英]Remove Entries From TreeMap, getting java.util.NoSuchElementException

我试图使用某些逻辑从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)

那是什么例外? 这是迭代过程中的错误。 也请建议我正确的方法。

您应该使用Iterator#hasNext()而不是Iterator#next()进行检查,如下所示:

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

您应该检查下一个元素,例如:

    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

当您遍历最后一个元素时,“下一个”点为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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM