私は間違っているかもしれませんが、私にとっては、オブジェクトの等価をオーバーライドして、それらが有意義に等しいとみなせるようにすることができます。 マップ内のすべてのエントリに異なるキーがあり、セット内のすべてのエントリに異なる値があります(有意義ではありません)Sortedコレクション内の2つの等しいオブジェクトを区別するにはどうすればよいですか?
しかし、TreeMapまたはTreeSetを使用するとコンパレータを提供できます。 コンパレータが用意されていると、オブジェクトのequalsメソッドがバイパスされ、コンパレータが0を返すときに2つのオブジェクトが等しいとみなされることに気づきました。 したがって、2つのオブジェクトがありますが、マップキーセット、保持された。
ソートされたコレクションを使用して、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());
}
( "XXX")を新しい文字列を使用して文字列プールの使用を回避することに注意してください、これS1 = s2が。 コンパイラを実装する方法を知りたいので、サイズが2ではなく1になるようにしてください。
主な質問は、同じ文字列値の2つの異なるインスタンスについてです。私の比較で?私はそのコンパレータがルールを尊重したいのですが
注:
はオーダーのために2つの引数を比較します。最初の引数が2番目の引数よりも小さい、等しい、または大きい場合は、負の整数、ゼロまたは正の整数を返します。実装者は、すべてのxとyについてsgn(compare(x、y))== -sgn(compare(y、x))を保証する必要があります。
実装者は、関係が推移的であることを確実にする必要があります。((compare(x、y))は、例外をスローする必要があります。 (y、z)> 0))は、compare(x、z)> 0を意味する。
最後に、compare(x、y)== 0は、すべてのzに対してsgn(compare(x、z))== sgn(y(z))を保証する必要があります。
(compare(x、y)== 0)==(x.equals(y))が一般的ですが、必ずしもそうである必要はありません。一般に、この条件に違反するコンパレータは、この事実を明確に示すはずです。推奨される言語は "注:このコンパレータはequalsと矛盾する順序を課します。"
私のようなトリックを使用することができます!
public int compare(String s1,String s2) {
if s1.equals(s2) { return -1 }
...
}
を
= -compare(S2、S1)正常に動作するようですが、(S1、S2)を比較するため、ルールは尊重されていませんこの問題の解決策はありますか?
編集:私はそのようなことを聞いて、なぜ疑問に思ったもののために。実際の人生の問題よりも好奇心である。
しかし、私はすでにそのような状況にしてきたし、この問題の程度解決かかわら:
はあなたが持っている想像:
class Label {
String label;
}
各ラベルのためにあなたが関連付けられた文字列値を持っています。 ここで、label-> valueのマップを作成する場合はどうなりますか? しかし、マップキーと同じラベルを2回使用できるようにしたい場合はどうなりますか? Ex "label"(ref1) - > value1 "label"(ref2) - > value2 equalsを実装すると、2つの異なるLabelインスタンスが等しくないようになります。>これはHashMapで動作すると思います。
しかし、これらのラベルオブジェクトをアルファベット順にソートできるようにしたいのですが? コンパレータを提供するか、同等の機能を実装する必要があります。 しかし、同じラベルを持つ2つのラベルの間で注文を区別することはできますか? 私たちはする必要があります! compare(ref1、ref2)は0を返してはいけません。しかし、それは-1か1を返しますか?あなたはグアバを使用している場合 追加を課すであろう、あなたはOrdering.arbitrary()
を利用することができ、...
私は実際の識別子ではないので、Stringsをあなたのケースでは識別子(マップ用のキー)として使用しないでください。もしあなたが文字列 '' label ''を持っていれば、どのように2つの' 'Label''オブジェクトのどちらを知りたいでしょうか? – adranale
これはちょうど例ですが、実際には私は "ラベル"を持っているわけではありませんが、参照を分けなければなりません –