开发者

Java - Iterate Hashmap?

开发者 https://www.devze.com 2023-04-13 02:01 出处:网络
Iterator<Player> i开发者_运维知识库terator = plugin.inreview.keySet().iterator(); while (iterator.hasNext()) {
Iterator<Player> i开发者_运维知识库terator = plugin.inreview.keySet().iterator();
while (iterator.hasNext()) {
    Player key = (Player) iterator.next();
    chat.getRecipients().remove(key);
}

This throws an: java.util.NoSuchElementException

at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$EntryIterator.next(Unknown Source)
at java.util.HashMap$EntryIterator.next(Unknown Source)

Any ideas as to why this is happening? When this occurs, there is one key (with one value) in the map.


Better solution for iterating a hashmap (java 8+):

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
// ...
// ...

map.forEach((key, value) -> {
    System.out.println("Key: " + key + ", Value: " + value);
})


My guess is that your getRecipients() returns the same collection as plugin.inreview!

This would mean that you try to remove an element from the collection while you are iterating over it. This is of course bad.

Instead, you should do this

Vector toRemove=new Vector();
Iterator<Player> iterator = plugin.inreview.keySet().iterator();
while (iterator.hasNext()) {
  Player key = (Player) iterator.next();
  toRemove.add(key);
}
chat.getRecipients().removeAll(toRemove);

Another possibility is that you have several threads?

0

精彩评论

暂无评论...
验证码 换一张
取 消