6

私はJavaが初めてで、ハッシュテーブルについて学ぼうとしています。オブジェクトをハッシュ テーブルに挿入し、最後にハッシュ テーブルからすべてのオブジェクトを出力できるようにしたいと考えています。get() メソッドまたは hashCode() メソッドをオーバーライドする必要があることを読んだので、これを正しく行っているかどうかはわかりませんが、その理由はわかりません。

生徒名の String オブジェクトを渡しています。挿入後にデバッガーを実行すると、キーが「null」として表示され、挿入のインデックスがハッシュ テーブルのランダムな場所に表示されます。元。1、6、10

これが私が追加している方法です。これが正しいかどうか、実際にオーバーライドする必要があるかどうかを誰かに教えてもらえますか?

前もって感謝します!

コード

 Hashtable<String,String> hashTable=new Hashtable<String,String>();
 hashTable.put("Donald", "Trump");
 hashTable.put("Mike", "Myers");
 hashTable.put ("Jimmer", "Markus");
4

2 に答える 2

4

あなたは物事を正しく行っています。aHashtableは直接アクセス構造体ではないことに注意してください。Hashtableたとえば、「 a から 3 番目の項目を取得する」ことはできません。について話している場合、「インデックス」という用語には実際の意味はありませHashtableん。アイテムの数値インデックスは何の意味もありません。

は、キーに基づいて値を結論付けるのが非常にHashtable高速になるように、キーと値のペアを保持することを保証します(たとえば、与えられた は、非常に迅速に取得されます)。もちろん、これが正しく機能するには特定の条件を満たす必要がありますが、単純な文字列から文字列への例では、それが機能します。DonaldTrump

ハッシュテーブルが舞台裏で実際にどのように機能するかを確認するには、一般的なハッシュテーブルについてもっと読む必要があります。

編集Student(OPの要求による):インスタンスをハッシュテーブルに保存することについて質問しています。上で述べたように、Hashtable が正しく機能するには、特定の条件に対処する必要があります。これらの条件は、値の部分ではなく、キーの部分に関するものです。

Studentインスタンスがvalueで単純な String がkeyの場合、String プリミティブは適切な Hashtable キーに必要なすべての条件に既に応答しているため、特別なことは何もありません。

Studentインスタンスがキーの場合、次の条件を満たす必要があります。

  1. の内部では、以降の の呼び出しがまったく同じ値を返すようにメソッドをStudentオーバーライドする必要があります。つまり、式は常にtrue でなければなりません。hashCodehashCodex.hashCode() == x.hashCode()

  2. の内部では、 の 2 つの同一のインスタンスに対してのみ戻り、それ以外の場合は戻るように、メソッドをオーバーライドStudentする必要があります。equalstrueStudentfalse

これらの条件はStudent、適切な Hashtable キーとして機能するのに十分です。より良い実装を書くことでさらに最適化することができますhashCode(それについて読んでください...ここに入力するのはかなり長いです)。

例:

class Student {
    private String name;
    private String address;

    public int hashCode() {
        // Assuming 'name' and 'address' are not null, for simplification here.

        return name.hashCode() + address.hashCode();
    }

    public boolean equals (Object other) {
        if (!(other instanceof Student) {
            return false;
        }
        if (other == this) {
            return true;
        }

        Student otherStudent = (Student) other;
        return name.equals(otherStudent.name) && address.equals(otherStudent.address);
    }
}
于 2012-12-08T01:14:55.187 に答える
1

このコードを試してください:

 Hashtable<String,String> hashTable=new Hashtable<String,String>();

 hashTable.put("Donald", "16 years old");
 hashTable.put("Mike", "20 years old");
 hashTable.put ("Jimmer", "18 years old");

Enumeration studentsNames; 
String str; 


// Show all students in hash table. 
studentsNames = hashTable.keys(); 
while(studentsNames.hasMoreElements()) { 
str = (String) studentsNames.nextElement(); 
txt.append("\n"+str + ": " + hashTable.get(str)); 
} 
于 2012-12-08T01:27:04.903 に答える