当前位置: 首页 > 知识库问答 >
问题:

为什么Java集上的remove()方法不起作用

邵正雅
2023-03-14
    Set<Set<Integer>> groups = new HashSet<>();

    for (int[] edge : edges) {
        Set<Integer> match1 = null;
        Set<Integer> match2 = null;

        for(Set<Integer> group : groups) {
            if(group.contains(edge[0])) match1 = group;
            if(group.contains(edge[1])) match2 = group;
        }

        if(match1 != null && match1 == match2) {
            result = edge;
        }else if(match1 != null && match2 != null && match1 != match2) {
            match1.addAll(match2);
            groups.remove(match2);     <---- This does not remove match2 from set
        }else{
            Set<Integer> newGroup = new HashSet<>();
            newGroup.add(edge[0]);
            newGroup.add(edge[1]);
            groups.add(newGroup);
        }
        
        .........
    }

但是,groups.remove(match2)方法不会从组中移除整数集。

这里发生了什么?

共有1个答案

彭烨烁
2023-03-14

引用接口文档:

注意:如果使用可变对象作为set元素,必须非常小心。当对象是集合中的元素时,如果以影响相等比较的方式更改对象的值,则不指定集合的行为。这种禁止的一个特例是不允许集合将自身作为元素包含。

addall()调用仍在外部中时,使用match1突变match1违反了此规则。变异导致在外部不知道的情况下更改哈希代码,因此内部现在位于错误的哈希桶中,当您在后续迭代中试图删除它时,无法找到它。

 类似资料:
  • 问题内容: 我有以下代码: 我希望它能打印a = 2 b = 1,但它却打印相反的东西。因此很明显,swap方法不会交换a和b值。为什么? 问题答案: 这与整数的不变性无关。它与 Java是值传递 ,该死 的事实有关! (不烦恼,只是文章标题:p) 总结一下:您实际上不能在Java中创建交换方法。您只需要在需要的地方自己进行交换即可。反正这只是三行代码,所以应该不成问题:)

  • 问题内容: 我有一个项目,我试图在回调中使用weakrefs,但我不明白我在做什么错。我创建了简化的测试,以显示我困惑的确切行为。 为什么在此测试中test_a可以正常工作,但是self.MyCallbackB的weakref在类初始化和调用test_b之间消失了?我以为只要实例(a)存在,对self.MyCallbackB的引用就应该存在,但是不存在。 问题答案: 您需要一个WeakMethod

  • 问题内容: 这是我所拥有的: 我是编程新手,所以如果这段代码看起来不成熟,我不会感到惊讶。无论如何,我让用户输入了一年零一个月(前三个字母)。我为a年创建了一个布尔变量,该变量表示用户输入的任何年份都需要被4、100和400整除。然后,我创建了一个if语句,以确认是否是a年才能打印出“ Feb(任何年份用户输入)中有DaysLeapYear。” 我认为我的算法有问题,因为如果我要取出TwentyE

  • 问题内容: 从Java 6 文档中: 为什么它接受对象而不是通用类型E?唯一可以添加的对象是类型E,因此,唯一的可移动类型应该是类型E。 问题答案: ,如果给定 相等的 元素(根据),则需要工作。在Java中,不同类的对象可能相等(在某些情况下是必需的)。因此,您不应限制类型。

  • 我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 5 6 7 8。