今天笔试过程中碰到了需要在迭代器遍历过程中,对map进行修改,删除、添加的操作,一直没有碰到过这种情况,现在将大致过程记录一下
主要思路:
- 通过迭代器遍历,可以用
it.remove()
删除迭代器指向的对象 - 通过
entry.setValue()
可以修改当前迭代器指向的对象 - 通过将要添加的键值对存入一个临时 map 中,在迭代器结束遍历后,调用
putAll()
方法将键值对添加进 map 中
// 遍历nums,迭代器方法
boolean flag = true;
while (flag) {
// 新建一个临时 treemap,存放遍历一遍map后的结果
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
TreeMap<Integer, Integer> temp = new TreeMap<>();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
// 取当前的数量 num,计算合并后新魔力的数量 newNum
int num = (Integer)entry.getValue();
int newNum = num / 2;
// 新魔力的数量不为 0,存入临时的 treemap
// 新魔力的数量为0,直接跳过,到下一个
if (newNum != 0) {
int key = (Integer)entry.getKey();
int newKey = key + 2;
temp.put(newKey, map.getOrDefault(newKey, 0) + newNum);
// 判断当前魔力值,不能被2整除,修改为1,能被2整除,删除掉
if (num % 2 != 0) {
entry.setValue(num % 2);
} else {
it.remove();
}
}
}
if (temp.size() == 0) flag = false;
else {
map.putAll(temp);
}
}