2014-03-24 61 views
0

我的問題涉及到改變一個表達式在java中使其多態。該類稱爲csHash,用於根據給定的數據類型DT和給定的鍵類型KT創建哈希表。現在,在類中的幾個方法(刪除,搜索,插入等)中,該方法使用equals函數,該函數在非多態版本中僅使用String(因爲非多態版本中的密鑰是類型的串)。我在想的是創建一個等於方法寫成以下代碼的行。我的問題是......它是一種檢驗平等的有效手段嗎?創建一個多態的等於表達式

public boolean equals(Object x) { 
    String i; 
    i = new String[1];  
    String y; 
    y = new String[1]; 
    i == i + this;    // use the + operator to add 'this' object 
    y == y + (findkey(other))x; // do the same for other object. findkey methods returns KT for a given object, i use this return to typecast the Object x. 
    int j = i.compareTo(y);  // use built in String compare method 

    if(j = 0) {return true;} // use if else to determine if they are equal 
    else {return false;} 
} 

回答

0

我會通過讀取規格開始:

指示某個其他對象是否「等於」這一項。

equals方法實現上非空 對象引用的等價關係:

自反性:對於任何非空引用值x,x.equals(x)的 應返回true。它是對稱的:對於任何非空參考值 x和y,當且僅當y.equals(x) 返回true時,x.equals(y)才返回true。它是傳遞性的:對於任何非空引用值x, y和z,如果x.equals(y)返回true並且y.equals(z)返回true,那麼x.equals(z)應該返回true。它是一致的:對於任何 非空引用值x和y,x.equals(y) 的多個調用始終返回true或始終返回false,前提是沒有 對對象的等同比較中使用的信息進行了修改。對於 ,任何非空引用值x,x.equals(null)應該返回false。 對象類的equals方法實現了對象上最有區別的 可能的等價關係;也就是說,對於任何非空 引用值x和y,當且僅當x 和y引用同一對象(x == y的值爲true)時,此方法返回true。

注意,這是通常需要覆蓋hashCode方法 每當這個方法被覆蓋,以便維持對hashCode方法,其中指出,等於對象必須 具有相等的哈希碼的一般 合同。

換句話說,只要給定的三個對象的x,y和z下面將舉行:

x.equals(y) implies y.equals(x) 
!x.equals(y) implies !y.equals(x) 
x == y implies x.equals(y) 
x.equals(y) && y.equals(z) implies x.equals(z) 

如果你的equals方法如下這份合同,那麼它是一個有效的Java對象。等於執行。您可以非常容易地爲此創建大量的單元測試,以確保覆蓋所有角落案例。

請注意,您還必須重寫hashCode的相關行爲。

0

您的equals方法存在問題,因爲它不會將兩個散列表與桶中的所有項進行比較。也不排除一些情況。在CSHashequals方法的示例性的失控看起來像下面以滿足equals法的一般原則:

@Override 
    public boolean equals(Object o) { 
     if (o == null) 
      return false; 
     if (this == o) 
      return true; 
     if (!(o instanceof CSHash)) 
      return false; 
     CSHash other = (CSHash) o; 
     return this.entrySet().equals(other.entrySet()); 
    } 

這假設你已經在你的CSHash類中定義entrySet()方法來回報您的哈希值的設定表。您可以定義自己的entrySet()方法,類似於Java的HashMap類中的方法。

+0

這裏equals的目的不是要比較兩個哈希表,而是兩個不同的同一類對象,即兩個不同的學生通過比較該類(名稱)的關鍵字或比較兩個汽車類的對象比較他們的關鍵(MPG)。這也是一個自制的哈希類,它不利用內置的Java。 – JediOfTheGrey

+0

平等的方法是你的CSHash類中的類成員函數,對嗎?如果是這樣,那麼你需要使用平等的方法來比較CSHash的兩個對象。由於散列表由鍵和值組成,因此您需要比較由鍵和值組成的entrySet。您不需要使用Java的內置entrySet(),但是您可以爲CSHash類創建自己的entrySet()方法。如果你只需要比較鍵,那麼你可以簡單地覆蓋關鍵部分的平等方法。 – tonga