1

こんにちはみんな私はコンパレータb4を書いたことがなく、本当の問題を抱えています。ハッシュテーブルを作成しました。

Hashtable <String, Objects> ht;

Hashtable のコンパレータの書き方を誰か教えてもらえますか? 私が見た例では、equals とすべてをオーバーライドしていますが、手がかりがありません。以下のコードは私のものではありませんが、私が見つけた例です。ハッシュテーブルの重要な点は、このようにできないことを意味します。

 public class Comparator implements Comparable<Name> {
        private final String firstName, lastName;

        public void Name(String firstName, String lastName) {
            if (firstName == null || lastName == null)
                throw new NullPointerException();
        this.firstName = firstName;
            this.lastName = lastName;
        }

        public String firstName() { return firstName; }
        public String lastName()  { return lastName;  }

        public boolean equals(Object o) {
            if (!(o instanceof Name))
                return false;
            Name n = (Name)o;
            return n.firstName.equals(firstName) &&
                   n.lastName.equals(lastName);
        }

        public int hashCode() {
            return 31*firstName.hashCode() + lastName.hashCode();
        }

        public String toString() {
        return firstName + " " + lastName;
        }

        public int compareTo(Name n) {
            int lastCmp = lastName.compareTo(n.lastName);
            return (lastCmp != 0 ? lastCmp :
                    firstName.compareTo(n.firstName));
        }
    }
4

3 に答える 3

1

Comparator は、2 つの項目のどちらが大きいかを示します。これがあなたの HashTable にとって意味がある場合、あなただけがその意味を言うことができます。このように 2 つの HashTable を比較することは非常にまれです。

于 2010-03-07T16:58:29.643 に答える
1

それは Comparator クラスではありません。これは、Comparable を実装する Name クラスです。

Hashtable と Hashmap は Comparator も Comparable も使用しません。ソートされたキーが必要な場合は、TreeMap を使用します。

于 2010-03-08T00:24:04.317 に答える
0

コンパレータは、リストをソートするために使用されます。A Hashtable(ケースに注意してください) は、その要素によって順序付けられていません。キーを繰り返し処理することでテーブルを注文でき(キーで注文したい場合は、私は推測します)List、. 次に行うことは、 を並べ替えてListを反復処理し、Listから を使用しgetHashtable関連する値を取得することです。

以下に例を示します ( を使用HashMapします。Java コレクションの残りの部分とより統合されているためです。 AHashMapは基本的に と同じHashtableです)。

public static void main(String... arg) {
    HashMap<String, Object> x = new HashMap<String, Object>();
    x.put("second", " ordered!");
    x.put("first", "Correctly");

    LinkedList<String> keys = new LinkedList<String>();
    for(final String f : x.keySet()) {
        keys.add(f);
    }
    Collections.sort(keys, new Comparator<String>() {
        public int compare(String first, String second) {
            // return -1 is "first <  second"
            // return 1  is "first >  second"
            // return 0  is "first == second"
            return first.compareTo(second);
        }
    });

    for(final String f : keys) {
        System.out.print(x.get(f));
    }
    System.out.println();
}

リストの順序はkeys無名Comparatorクラスでソートされます。文字列のデフォルトと同様に、アルファベット順にソートされます。あなたが述べたように、独自のキーオブジェクトを使用できます。このキー オブジェクトに実装しない場合Comparatorは、上記の例のように指定できます。Comparatorそれ以外の場合は、次のように呼び出してデフォルトを使用できます。

Collections.sort(keys);

のクラス実装を使用しますComparator。を実装していない場合Comparator、例外がスローされます ( にキャストされるためComparator)

于 2010-03-07T17:00:08.860 に答える