2014-06-17 86 views
0

我想知道是否有可能在java中爲對象內的元素創建ID,因此如果使用相同的元素生成另一個對象,我可以檢查如果它是私人創造的。根據對象的內容創建一個唯一的ID

例1 `

{ 

    int[][] cha = new int[3][3]; 
    cha[0][0] = 8; 
    cha[0][1] = 1; 
    cha[0][2] = 3; 
    cha[1][0] = 4; 
    cha[1][1] = 0; 
    cha[1][2] = 2; 
    cha[2][0] = 7; 
    cha[2][1] = 6; 
    cha[2][2] = 5; 

    int[][] hol = new int[3][3]; 
    hol[0][0] = 8; 
    hol[0][1] = 1; 
    hol[0][2] = 3; 
    hol[1][0] = 4; 
    hol[1][1] = 0; 
    hol[1][2] = 2; 
    hol[2][0] = 7; 
    hol[2][1] = 6; 
    hol[2][2] = 5; 


    HashSet<int[][]> k = new HashSet(); 
    k.add(cha); 

    System.out.println(k.contains(cha)); 
    System.out.println(k.contains(hol)); 


}` 

在這種情況下,我西港島線得到的值「真,假」即使這兩個矩陣是相同的(我知道那是因爲HashSet的做參考的內存地址,而不是對象)。

我希望能夠第二次創建矩陣並確定它是否已經創建。

謝謝。

+0

你要修改的對象時,它被添加到後組? –

回答

0

包裝在一個類,定義自己的equals()hashcode()

0

我知道那是因爲HashSet的做參考的內存地址,而不是對象

不,這不是理由。原因是一個數組僅僅等於它自己,因爲數組不會覆蓋Object.equals()Object.hashCode()方法,HashSet用來檢查它已經包含的元素。

爲了獲得您想要的行爲,您需要將矩陣包裝到自己的類中,該類重寫equals()和hashCode(),以便告訴兩個矩陣何時相等。確保永遠不會修改矩陣的任何元素一旦被存入HashSet的:

public final class Matrix { 
    private int[][] elements; 

    public Matrix(int[][] elements) { 
     this.elements = elements; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (!(o instanceof Matrix)) { 
      return false; 
     } 
     Matrix m = (Matrix) o; 
     return Arrays.deepEquals(this.elements, m.elements); 
    } 

    @Override 
    public int hashCode() { 
     return Arrays.deepHashCode(elements); 
    } 
} 

現在你可以做

HashSet<Matrix> set = new HashSet<>(); 

Matrix m1 = new Matrix(cha); 
k.add(m1); 

System.out.println(set.contains(m1)); 

Matrix m2 = new Matrix(hol); 
System.out.println(set.contains(m2));