5

このサイトを利用するのは初めてなので、使い方が間違っていたら申し訳ありません。教えてください。

とにかく、2 つの文字列を受け取る Account オブジェクトがあります... acctName と lastName (コードは以下)。

キーが acctName であるハッシュ テーブルにこのオブジェクトを挿入し、衝突を減らすために多項式を使用したいと考えています。hashCode() と equal メソッドをオーバーライドする必要があると聞きました。私は正しくオーバーライドしたと信じていますが、呼び出されていないように見えるため、正しいかどうかはわかりません。私がこれを正しく行っているかどうか(適切な場所でオーバーライドして正しく追加するか)、追加後に印刷する方法を説明してもらえますか?

ありがとうございます。今後もコミュニティに貢献できることを楽しみにしています。

クラス ---> アカウント

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);

 }

Account オブジェクト内で GETTER を使用して編集する

   public String testGetter()
  {

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

5 に答える 5

1

ハッシュには、キー フィールドの HashCode が使用されます。文字列をキーとして使用し、カスタム クラスのハッシュコードを実装しています。それが呼び出されていない理由です。

于 2012-12-08T03:02:18.203 に答える
0

ハッシュマップは hashCode() 実装を実装して、ハッシュマップでキーとして使用されるオブジェクトからハッシュコードを計算します。

コードから、ユーザー名を対応するアカウントにマップしたいようです。そのような場合、hashCode() と equals() のオーバーライドは役に立ちません。

注 : オブジェクトの hashCode() は、オブジェクトがキーとして使用される場合にのみ使用されます。あなたの場合、 java.lang.String クラスの hashCode() を使用してハッシュマップに挿入しています。

  • hashCode と equals の条件

    1. Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。

    2. equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。

    3. equals() メソッドをオーバーライドするときはいつでも、hashCode() メソッドもオーバーライドする必要があります。

于 2012-12-08T06:28:05.703 に答える
0

あなたは自分が思っていることをしないことをいくつかやっています。オブジェクトに関係のないキーとして文字列を使用しています。アカウント名として使用したい文字列と同じであることは問題ではありませんが (これは実際には大文字の使用によるものではありません)、同じキーを 2 回使用して Hashmap 内のオブジェクトを上書きしています (hasmap です)。もうアカウントは保存されず、account3 のみが保存されます)。

マップの代わりにセットを使用したいようです。

于 2012-12-08T03:10:33.380 に答える
0

重複するアカウント名がない場合は、各アカウントの名前をマップ キーとして使用してもまったく問題ありません。

Account オブジェクトをキーとして使用していないため、hashCode()メソッドは呼び出されません。文字列を使用しています。

accountName を使用してアカウントをマップに配置する方法は次のとおりです。

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( ) をうまくオーバーライドしたようです。

そして... StackOverflow へようこそ。

于 2012-12-08T03:22:40.587 に答える
0

私はfolwinfを試しました。しかし、コンパイラは何も間違っていません!!!!

パッケージテスト;

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

}

于 2012-12-08T03:30:17.413 に答える