带有for循环和return语句的Junit测试问题

艾丽98

我对 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;
}

提前非常感谢!

XtremeBaumer

发生这种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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章