オブジェクトが一意の主キーを保持している場合、特に効率的にソート可能、ハッシュ可能などの点でコレクションに適したものにするために、どのインターフェイスを実装する必要がありますか?
主キーが文字列の場合、これらのインターフェイスはどのように最適に実装されますか?
ありがとう!
オブジェクトが一意の主キーを保持している場合、特に効率的にソート可能、ハッシュ可能などの点でコレクションに適したものにするために、どのインターフェイスを実装する必要がありますか?
主キーが文字列の場合、これらのインターフェイスはどのように最適に実装されますか?
ありがとう!
とをオーバーライド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つのオブジェクトが等しい場合は、次の点に注意してください。
compareTo()
0を返す必要があります。equals、hashCode、および(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);
}
}
文字列はすでにハッシュと比較に非常に適しているため、オブジェクトが文字列によって本当に一意に識別できる場合は、良好な状態です。ソートとオーバーライド、および(主キー文字列への委任)ハッシュComparable
用のインターフェイスを実装してください。これで準備完了です。equals
hashCode
主キーがの場合、ソート順がまたはの主キーObject
に基づいているかどうかを判断する必要がありObject
ます。Object
Object
いずれの場合も、ソートされるアイテムは、適切なメソッドComparable
を使用してインターフェースを実装する必要があります。compareTo()
オッズは優れています。つまり、主キーオブジェクトの一部のみが適切なデフォルトの実装を持っている可能性が高いため、オーバーライドする必要がequals()
あります。hashCode()
自然でない並べ替え順序に基づいて並べ替える場合は、いくつかの「追加」も実装しComparators
ます。Collections
代替サポートを注文しComparators
ました。