10

オブジェクトが一意の主キーを保持している場合、特に効率的にソート可能、ハッシュ可能などの点でコレクションに適したものにするために、どのインターフェイスを実装する必要がありますか?

主キーが文字列の場合、これらのインターフェイスはどのように最適に実装されますか?

ありがとう!

4

4 に答える 4

13

とをオーバーライドObject.equals()し、インターフェースObject.hashCode()を実装する必要がありComparableます。Collections.sort(これにより、)、任意のMapクラス、または任意のクラスの使用を含む、あらゆる種類の並べ替えまたはハッシュを実行するときに、クラスが完全に「準拠」しますSet。クラスが何らかのコレクションに入れられる可能性がわずかでもある場合は、これら3つのメソッドすべてを確実に実装する必要があります。

public class A implements Comparable<A>{
    private String key;

    @Override
    public boolean equals(Object obj){
        if (this == obj) return true;
        if (!(obj instanceof A)) return false;

        A that = (A)obj;
        return this.key.equals(that.key);    
    }

    @Override
    public int hashCode(){
        return key.hashCode();
    }

    @Override
    public int compareTo(A that){
        //returns -1 if "this" object is less than "that" object
        //returns 0 if they are equal
        //returns 1 if "this" object is greater than "that" object
        return this.key.compareTo(that.key);
    }
}

2つのオブジェクトが等しい場合は、次の点に注意してください。

  1. それらのハッシュコードも等しくなければならず、
  2. compareTo()0を返す必要があります。
于 2010-06-03T00:06:15.333 に答える
12

equalshashCode、および(Comparableインターフェースを実装した後)compareToを実装する必要があります。

いずれの場合も、主キーである文字列があるため、これらの呼び出しを文字列にディスパッチすることを検討してください。例えば:

public class Friendly implements Comparable<Friendly>
{
    // presumably you've got other fields as well
    private String primaryKey;
    public Friendly(String primaryKey)
    {
        this.primaryKey = primaryKey;
    }

    public int compareTo(Friendly other)
    {
        return primaryKey.compareTo(other.primaryKey);
    }

    public int hashCode()
    {
        return primaryKey.hashCode();
    }

    public boolean equals(Object o)
    {
        return (o instanceof Friendly) && primaryKey.equals(((Friendly)o).primaryKey);
    }
}
于 2010-06-02T23:48:06.217 に答える
5

文字列はすでにハッシュと比較に非常に適しているため、オブジェクトが文字列によって本当に一意に識別できる場合は、良好な状態です。ソートとオーバーライド、および(主キー文字列への委任)ハッシュComparable用のインターフェイスを実装してください。これで準備完了です。equalshashCode

于 2010-06-02T23:49:48.467 に答える
3

主キーがの場合、ソート順がまたはの主キーObjectに基づいているかどうかを判断する必要がありObjectます。ObjectObject

いずれの場合も、ソートされるアイテムは、適切なメソッドComparableを使用してインターフェースを実装する必要があります。compareTo()オッズは優れています。つまり、主キーオブジェクトの一部のみが適切なデフォルトの実装を持っている可能性が高いため、オーバーライドする必要がequals()あります。hashCode()

自然でない並べ替え順序に基づいて並べ替える場合は、いくつかの「追加」も実装しComparatorsます。Collections代替サポートを注文しComparatorsました。

于 2010-06-02T23:51:07.393 に答える