在Java中删除哈希集中的用户定义对象

在Java中删除哈希集中的用户定义对象,java,hashset,Java,Hashset,我创建了一个名为Idea的简单类,它带有一组列位置(我创建的另一个类只有一个x和y字段)。ColumnPosition中的equals和hashcode方法如下所示: @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; System.out.print

我创建了一个名为Idea的简单类,它带有一组列位置(我创建的另一个类只有一个x和y字段)。ColumnPosition中的equals和hashcode方法如下所示:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    System.out.println("hashCode: " + result);
    return result;
}

@Override
public boolean equals(Object obj) {
    if (obj instanceof ColumnPosition) {
        ColumnPosition cp = (ColumnPosition) obj;
        if (cp.x != this.x || cp.y != this.y) {
            return false;
        }
    }
    return true;
}
但是,当我去测试Idea类并尝试删除Idea对象哈希集中的ColumnPosition对象时。它不起作用。怎么了??谢谢

public void test_HashSetRemoveColumnPosition() {
    ColumnPosition column_03 = new ColumnPosition(0, 3);

    Set<ColumnPosition> columns = new HashSet<ColumnPosition>();
    columns.add(column_03);

    this.idea.getColumnPositions().add(column_03);
    assertEquals(1, columns.size());

    assertTrue(this.idea.getColumnPositions().remove(column_03)); // this is passing
    assertEquals(0, columns.size()); // this is failing because columns.size() still equals 1. WHAT?! How is this possible if the remove method returned true?
}
公共无效测试\u HashSetRemoveColumnPosition(){
ColumnPosition column_03=新的ColumnPosition(0,3);
Set columns=new HashSet();
列。添加(第03列);
this.idea.getColumnPositions().add(column_03);
assertEquals(1,columns.size());
assertTrue(this.idea.getColumnPositions().remove(column_03));//这是传递
assertEquals(0,columns.size());//这是失败的,因为columns.size()仍然等于1。什么?!如果remove方法返回true,这怎么可能?
}

确保
this.idea.getColumnPositions()
是与
columns
相同的对象。您有两个哈希集:测试中的局部变量和测试类中的字段。它们是不同的,所以当你从一个对象中删除时,另一个对象不会被修改…

第一个问题:当有人使用任何非ColumnPosition对象调用
equals
时,你返回
true
。我想我们需要查看
this.idea.unionColumnPositions(columns)
this.idea.getColumnPositions()的源代码
。接下来,取出
etc部分-我们不知道这是什么作用。只需尝试
列。例如,删除(列03)
。我想那会管用的。然后您需要查看
unionColumnPositions
的功能。
columns
是方法中的局部变量,在
assertTrue(this.idea.getColumnPositions().remove(column_03))中方法您正在从引用
集的实例变量中删除元素