2012-12-08 42 views
5

這是我第一次使用這個網站,所以我很抱歉,如果我沒有正確使用它。請讓我知道。Hashtable重寫

無論如何,我有一個帳戶對象,需要2個字符串...一個acctName和lastName(代碼如下)。

我想插入這個對象到一個哈希表中,鍵是acctName,我想用多項式來減少碰撞。我聽說我必須重寫hashCode()和等同的方法。我相信我已被正確覆蓋,但我不確定它是否正確,因爲它似乎沒有被調用。有人可以告訴我,如果我這樣做是正確的(覆蓋在正確的位置,並正確添加),並向我解釋如何添加後打印?

感謝並期待在未來爲社區做出貢獻!

類--->帳戶

public class Account 
{ 

private String acctName; 
private String lastName; 

public Account(String acctName, String lastName) 
    { 
    this.acctName= acctName; 
    this.lastName= lastName 
    } 

@Override 
public int hashCode() { 

    return acctName.hashCode() + lastName.hashCode(); 

} 

@Override 
public boolean equals (Object otherObject) { 
    if (!(otherObject instanceof Account)) { 
     return false; 
    } 
    if (otherObject == this) { 
     return true; 
    } 

    Account accountHolder = (Account) otherObject; 
    return acctName.equals(accountHolder.acctName) && lastName.equals(accountHolder.lastName); 
} 

類---->驅動

public void insertInto() 
{ 
Hashtable<String,Account> hash=new Hashtable<String,HoldInformation>(); 
Account account= new Account ("Deposit", "Jones"); 
Account account2= new Account ("Withdraw", "Smith"); 


hash.put ("deposit", account); 
hash.put ("Withdraw", account2); 

} 

吸氣劑INSIDE帳戶對象EDIT

public String testGetter() 
    { 

    return acctName.hashCode() + lastName.hashCode(); 
    } 

回答

1

密鑰字段的HashCode用於散列。您使用字符串作爲鍵,併爲您自定義類實現哈希碼。這就是爲什麼它沒有被調用。

+0

啊是有道理的,我的問題是,我的客戶對象需要acctName和lastName到一個對象。正如我所說,acctName是關鍵。那麼,如果我在Account對象中擁有我需要的所有東西,那麼當聲明散列表時,我可以使用什麼關鍵字段? – michael

+0

或者我應該將所有內容都放入Account對象而不是驅動程序中?謝謝! – michael

+0

在你的類中添加一個getter方法,它將返回「」acctName.hashCode()+ lastName.hashCode();「」。然後使用返回值作爲散列表的關鍵字。 –

0

你正在做一些不符合你想法的事情。您正在使用字符串作爲與您的對象無關的鍵。無關緊要的是您想要用作帳戶名稱的相同字符串(實際上不是因爲您的大寫),但是您還使用相同的密鑰兩次覆蓋Hashmap中的對象(您是hasmap將不再存儲帳戶,只有帳戶3)。

它在我看來你想要使用一個集合而不是一個地圖。

+0

謝謝你的答覆palako ...我會研究映射,但現在我們可以忽略我有兩次相同的密鑰?爲了學習的目的...假定它不是同一個關鍵。編輯製作 – michael

+0

如果你不打算有acctName重複,你想用它作爲你的地圖的關鍵,那麼只需做hash.put(account.getAcctName(),account);你不需要重寫equals或hashcode。如果你確實認爲你會有重複,並且你不需要密鑰,那麼保留你的等號和哈希碼並使用一個Set,它會做和地圖一樣的事情,但是沒有密鑰,並且阻止你做出決定。 – palako

0

如果您沒有任何重複的帳戶名稱,那麼使用每個帳戶的名稱作爲地圖密鑰是完全正確的。

您的hashCode()方法沒有被調用,因爲您沒有使用Account對象作爲鍵:您正在使用Strings。

這裏是你將如何使用其帳戶名把一個帳號進入地圖:

Account accountOne = new Account("checking", "Smith"); 
Account accountTwo = new Account("saving", "Jones"); 

Map<String, Account> accountMap = new HashMap<String, Account>(); 

accountMap.put(accountOne.getAcctName(), accountOne); 
accountMap.put(accountTwo.getAcctName(), accountTwo); 

請注意,您必須實現Account.getAccntName(),它應該是這樣的:

public String getAccttName() { 
    return acctName; 
} 

順便說一句,它看起來像你已經做了很好的工作覆蓋的hashCode()的equals()

And ...歡迎來到StackOverflow。

+0

謝謝jahroy!只是想知道你的代碼是...你的版本仍然使用hashTables ...就像HashMap? – michael

+0

哦,是的......哎呀。我習慣於使用HashMap。 Hashtable的實現應該是相同的(它們都實現了Map)。 – jahroy

+0

不用擔心謝謝。但我的重寫方法似乎並沒有被調用。任何想法爲什麼? – michael

0

我試過了follwinf。但編譯器不顯示任何錯誤!

封裝測試;

import java.util.Hashtable; 

public class Account { 
private String acctName; 
private String lastName; 

public Account(String acctName, String lastName) 
    { 
    this.acctName= acctName; 
    this.lastName= lastName; 
    } 

@Override 
public int hashCode() { 

    return acctName.hashCode() + lastName.hashCode(); 

} 

@Override 
public boolean equals (Object otherObject) { 
    if (!(otherObject instanceof Account)) { 
     return false; 
    } 
    if (otherObject == this) { 
     return true; 
    } 

    Account accountHolder = (Account) otherObject; 
    return acctName.equals(accountHolder.acctName) && lastName.equals(accountHolder.lastName); 
} 

public String testGEtter() 
{ 
    return lastName+","+acctName; 
} 

public static void mian(String args[]) 
{ 
    Hashtable<String , Account> table = new Hashtable<>(); 
    Account acc= new Account("test1", "test2"); 
    table.put(acc.testGEtter(), acc); 
} 

}

+0

它也適用於我...好吧最後的問題,因爲我不想再打擾你了... :)這段代碼與我之前的代碼有什麼不同(原來的?唯一的區別是你使用了一個getter作爲鍵,而我硬編碼它你剛纔說的覆蓋方法沒有被調用的原因是因爲我的密鑰是一個字符串,並且覆蓋仍然沒有被調用...... – michael

+0

好的,起初你是用這個調用的---- - 「」「hash.put(」deposit「,account);」「 看一下」deposit「字符串,string類有它自己的toHashcode函數,所以你的Account類中的hashCode實現不會用於散列。 toHashcode函數作爲關鍵字用於hasihing,並且lastname和acctname都不用於hasing。這是主要的區別,但是當你用「」table.put(acc.testgetter(),acc)調用時, ;「」「這個---結合你的姓名字段並使用t帽子連接的字符串是關鍵。 –

0

HashMap中實現哈希碼()實現,以計算從所述對象的哈希碼以用作在散列映射鍵。

從您的代碼中,您似乎希望將用戶名映射到相應的帳戶。在這種情況下,hashCode()和equals()重寫是沒有用的。

注意:只有在對象被用作鍵時,纔會使用對象的hashCode()。 在你的情況下,正在使用java.lang.String類的hashCode()插入到Hash映射中。

  • 條件的hashCode和equals

    1. 每當它是一個Java應用程序的執行期間,在同一對象不止一次調用,hashCode方法必須一致地返回相同的整數,沒有提供在對象上的等號比較中使用的信息被修改。該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。

    2. 如果兩個對象根據equals(Object)方法相等,則對兩個對象中的每個對象調用hashCode方法必須產生相同的整數結果。

    3. 每當您重寫equals()方法時,您也必須重寫hashCode()方法。