我对 for-loop & return 语句有点困惑。我希望有人可以向我解释发生了什么。
private Map<Ticket, Integer> list;
public RessourceBasedAccessControl32603() {
super();
list = new HashMap<>();
}
我必须从这个junit测试中编写一个工作方法:
@Test
void testRemoveCollection2() {
accessControl.add(t1, 10);
accessControl.add(t2, 20);
accessControl.add(t3, 30);
Set<Ticket> s = new HashSet<>();
s.add(t1);
s.add(t3);
int actual = accessControl.remove(s);
assertEquals(40, actual);
}
如果我编写此代码,我会得到预期的 40。
@Override
public int remove(Collection<Ticket> c) {
int points = 0;
for (Ticket i : c) {
if (list.containsKey(i)) {
points += list.remove(i);
}
}
return points;
}
如果我编写这段代码,我会得到 30 而不是 40。我只是得到最后添加的数字 (t3) 而不是 t1 + t3)。我很确定它不是因为第一次返回而总结的,但是如果我删除第一次返回,我会得到一个“java.util.ConcurrentModificationException”。为什么我不能像上面的例子一样只使用一个 return?有什么不同?是否还有一种方法可以将 HashSet 中的所有票证 t 相加?
@Override
public int remove(Collection<Ticket> c) {
int points = 0;
for (Ticket i : list.keySet()) {
if (c.contains(i)) {
points += list.remove(i);
return points;
}
}
return points;
}
提前非常感谢!
发生这种ConcurrentModificationException
情况是因为您从 , 中删除了一个项目HashMap
,同时仍在对其进行迭代。如果您离开return
,那么您在修改密钥集时不会对其进行迭代。
如果您想走那条路线,请在完成迭代后删除这些项目。
public int remove(Collection<Ticket> c) {
int points = 0;
for (Ticket i : list.keySet()) {
if (c.contains(i)) {
points += list.get(i);
// return points;
}
}
list.keySet().removeAll(c);
return points;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句