【问题标题】:Java HashMap Iterator Remove ErrorJava HashMap 迭代器删除错误
【发布时间】:2015-09-01 21:43:50
【问题描述】:

我有以下哈希图:

Map<String,String> studentGrades = new HashMap<>();
studentGrades.put("Tom", "A+");
studentGrades.put("Jack", "B+");

Iterator<Map.Entry<String,String>> iterator = studentGrades.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String,String> studentEntry = iterator.next();
    System.out.println(studentEntry.getKey() + " :: " + studentEntry.getValue());
    iterator.remove();
}

我认为iterator.remove(); 意味着将从HashMap 中删除某些内容,例如iterator.remove("Tom");,然后在迭代发生时将其从HashMap 中删除。

程序在iterator.remove(); 时编译并正确运行,但在iterator.remove("Tom"); 时发现错误。编译器说

必需:无参数并找到:java.lang.String 原因:实际参数列表和形式参数列表的长度不同。

有什么原因会发生这种情况,或者我的 iterator.remove(); 完全错了吗?

【问题讨论】:

  • 您不能将字符串传递给 remove 方法,因为它不能那样工作。阅读 Iterator 的 Javadocs 以了解它的工作原理。
  • 什么可以传递给 remove 方法?
  • 嗯,答案很容易理解,而且从列表或任何您想要的数据集中删除实体,同时在其中循环,这也不是一个好主意。
  • 我只是作为一种方式来显示所有结果(并迭代它们),在它们迭代时,删除一个然后在同一个循环中显示新结果
  • AntJavaDev Iterator.remove() 方法/API 正是用于在迭代时删除实体。过滤数据是一个常见的用例。

标签: java iterator hashmap hashtable


【解决方案1】:

根据JavaSE 7 JavaDocIteratorremove 方法:

从底层集合中移除此迭代器返回的最后一个元素(可选操作)。

它从集合中删除当前元素,并且“每次调用 next() 只能调用一次”。它针对迭代中的当前值运行并且不接受任何参数。它也是可选的,我不确定你会从你的例子中获得什么。没有它你应该没问题。

顺便说一句:我建议您在迭代 HashMap 时,也许您可​​以尝试使用 for-in 方法,例如:

public static void main(String[] args) {
    HashMap<String, String> studentGrades = new HashMap<String, String>();
    studentGrades.put("Tom", "A+");
    studentGrades.put("Jack", "B+");

    for( Map.Entry<String, String> studentEntry : studentGrades.entrySet() ){
        System.out.println(studentEntry.getKey() +" :: "+ studentEntry.getValue());
    }
}


更新(每个评论线程): 顺便说一句,我试了一下,它工作正常,输出没有错误。如果您对使用 java.util.Iterator 和 Iterator 的下一个 remove 方法一无所知,这应该可以工作。为方便起见,我在a scrapbook page 中对其进行了测试。
public static void main(String[] args) {
    HashMap<String,String> studentGrades = new HashMap<String, String>();
    studentGrades.put("Tom", "A+");
    studentGrades.put("Jack", "B+");

    Iterator<Map.Entry<String,String>> iterator = studentGrades.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String,String> studentEntry = iterator.next();
        System.out.println(studentEntry.getKey() + " :: " + studentEntry.getValue());
        iterator.remove();
    }
}

【讨论】:

  • 感谢您的详细帮助。我已经尝试过了,但是 studentGrades.entry() 出现错误,说找不到方法条目
  • 那是因为我打错了,忘记放 entrySet() 而不是 entry()。它已更新。基本上,您可以(更直接地?)只迭代 Map Entry 对而不是创建迭代器。我们可以用更少的代码行来做同样的事情。这里是a decent link on the Map Interface(相对于 Collection、Set 等)。
  • 再次感谢您,entrySet() 出现错误,提示类型不兼容(括号)
  • 是的,当我更新我的示例时,我设置了您定义 HashMap 的类型;如果你愿意,你可以删除它。
  • 我对 Java 还很陌生,所以我真的不知道这意味着什么抱歉
【解决方案2】:

在不同的类/接口中有两个名为remove的方法

  1. Iteratorremove() 删除了上一个返回的项目。

  2. Collectionremove(object) 从集合中删除特定对象

只有第二个有object 参数。但要注意:使用它会使迭代器无效,所以不要从同一个集合的循环中调用它,它不会工作。对于过滤,请使用迭代器(就像您一样)及其remove() 方法。

【讨论】:

  • 感谢您的帮助。那么在我的 Iterator 代码中,我应该在哪里放置 Iterator remove 以删除特定键?
  • Map 不是Collection (至少不是继承方式)。集合有remove(element) 映射有remove(key),所以考虑将Collection 更改为Map
  • 在我的 Iterator 代码中,我应该在哪里放置 Iterator remove 以删除特定键?
  • 在你的remove()周围加上一个if...并阅读Iterator的文档!
猜你喜欢
  • 2013-02-17
  • 2015-09-19
  • 2012-11-30
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多