2013-06-18 18 views
0

我創建了一個名爲Idea的簡單類,其中包含ColumnPositions的HashSet(另一個類,我只創建了一個x和y字段)。在ColumnPosition的equals和hashCode方法是這樣的:刪除Java中的HashSet中的用戶定義對象

@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; 
} 

然而,當我去驗證這一想法類和嘗試的想法對象的HashSet中刪除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? 
} 
+6

第一個問題:當有人用任何非ColumnPosition對象調用equals時,你返回true。 –

+1

我想我們需要查看'this.idea.unionColumnPositions(columns)'和'this.idea.getColumnPositions()'的來源。 – GriffeyDog

+3

接下來,拿出'unionColumnPositions'等部分 - 我們不知道這是什麼。例如,嘗試'columns.remove(column_03)'。我懷疑這會起作用。那麼你需要看看'unionColumnPositions'的作用。 –

回答

1

確保this.idea.getColumnPositions()是相同的對象columns

+0

當然是。 –

0

您有2個哈希集:測試中的本地變量和測試類中的字段。他們是不一樣的,所以當你從一個刪除,另一個沒有修改...