私は間違っているかもしれませんが、私にとっては、オブジェクトのequalsをオーバーライドして、意味のあるequalsであるとみなすことができます。マップ内のすべてのエントリには個別のキーがあり、セット内のすべてのエントリには個別の値があります(意味のある等しいものではありません)
ただし、TreeMapまたはTreeSetを使用する場合は、コンパレータを提供できます。コンパレータが提供されている場合、オブジェクトのequalsメソッドがバイパスされ、コンパレータが0を返す場合、2つのオブジェクトが等しいと見なされることに気付きました。したがって、2つのオブジェクトがありますが、マップキーセットまたはセット内には1つだけが保持されます。
ソートされたコレクションを使用して、2つの異なるインスタンスを区別できるかどうかを知りたいです。
簡単なサンプルは次のとおりです。
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<String>();
String s1 = new String("toto");
String s2 = new String("toto");
System.out.println(s1 == s2);
set.add(s1);
set.add(s2);
System.out.println(set.size());
}
new String( "xxx")を使用すると、文字列プールの使用がバイパスされるため、s1!=s2になることに注意してください。セットサイズが1ではなく2になるようにコンパレータを実装する方法を知りたいのですが。
主な質問は次のとおりです。同じ文字列値の2つの異なるインスタンスの場合、コンパレータで!= 0を返すにはどうすればよいですか?
そのコンパレータにルールを尊重させたいことに注意してください。
順序について2つの引数を比較します。最初の引数が2番目の引数よりも小さい、等しい、または大きい場合、負の整数、ゼロ、または正の整数を返します。実装者は、すべてのxとyに対してsgn(compare(x、y))== -sgn(compare(y、x))であることを確認する必要があります。(これは、compare(y、x)が例外をスローする場合にのみ、compare(x、y)が例外をスローする必要があることを意味します。)
実装者は、関係が推移的であることも確認する必要があります:((compare(x、y)> 0)&&(compare(y、z)> 0))はcompare(x、z)>0を意味します。
最後に、実装者は、compare(x、y)== 0がすべてのzに対してsgn(compare(x、z))== sgn(compare(y、z))を意味することを確認する必要があります。
一般的にはそうですが、厳密には(compare(x、y)== 0)==(x.equals(y))である必要はありません。一般的に、この条件に違反するコンパレータは、この事実を明確に示す必要があります。推奨される言語は「注:このコンパレータは、equalsと矛盾する順序を課します」です。
私は次のようなトリックを使うことができます:
public int compare(String s1,String s2) {
if s1.equals(s2) { return -1 }
...
}
正常に動作しているように見えますが、compare(s1、s2)!= -compare(s2、s1)であるため、ルールは尊重されません。
それで、この問題に対するエレガントな解決策はありますか?
編集:なぜ私がそのようなことを尋ねるのか疑問に思っている人のために。それは、現実の問題よりも好奇心によるものです。
しかし、私はすでにそのような状況にあり、この問題の解決策についてですが:
あなたが持っていると想像してください:
class Label {
String label;
}
ラベルごとに、関連付けられた文字列値があります。マップ、label->valueが必要な場合はどうでしょうか。しかし、マップキーと同じラベルを2倍持つことができるようにするにはどうすればよいでしょうか。Ex "label"(ref1)-> value1 "label"(ref2)-> value22つの異なるLabelインスタンスが等しくないようにequalsを実装できます->HashMapで機能すると思います。
しかし、これらのLabelオブジェクトをアルファベット順に並べ替えることができるようにするにはどうすればよいでしょうか。コンパレータを提供するか、同等のものを実装する必要があります。しかし、同じラベルを持つ2つのラベルをどのように区別することができますか?我々はしなければならない!compare(ref1、ref2)は0を返すことはできません。ただし、-1または1を返す必要がありますか?メモリアドレスなどを比較してそのような決定を下すことができますが、Javaでは不可能だと思います...