1

私はJavaで少し数学をコーディングしようとしています。私がやろうとしているのは、円分コセットをTreeSetに配置することです。剰余類には、インデックスと整数のセットがあります。セットに同じ要素がある場合、剰余類は他の剰余類と同じです。セットが異なる場合、剰余類はそのインデックス順に並べられます。

例えば:

C1 = [1, 2, 4, 8]
C3 = [3, 6, 9, 12]
C9 = [3, 6, 9, 12]

C1 is less than C3
C3 is equal to C9

十分な数学。重複する要素は必要なく、インデックスで並べ替える必要があるため、剰余類をTreeSetに配置することにしました。

問題は、TreeSet.contains()がfalseを返す場合でも、compareTo()メソッドとequals()メソッドを使用したときに等しい1つの要素をTreeSetで見つけることができます。

これは、プログラムの実際のプリントアウトです。

cosets = [C0, C1, C3, C5, C7]
cosets.contains(C9) = false
C0.compareTo(C9) = -1, C0.equals(C9) = false
C1.compareTo(C9) = -1, C1.equals(C9) = false
C3.compareTo(C9) = 0, C3.equals(C9) = true
C5.compareTo(C9) = -1, C5.equals(C9) = false
C7.compareTo(C9) = -1, C7.equals(C9) = false

以下のコードを添付します。コードが魔法のように機能することがわかったので、コードを単純化したくありませんでした。コードでMAGIC_INDEXの値を7以下に変更すると、動作を開始します。私にはJVMのバグのようです。

http://2m.lt/files/Main.java

http://2m.lt/files/Coset.java

助言がありますか?

4

3 に答える 3

4

よく言うように、プログラムにバグがある場合は、デバッガーを使用してください。これは私にあなたの問題をすぐに示しました。

TreeSetは二分木です。検索するときは、探している要素が調べている要素の前か後か(または同じか)に基づいてツリーを下に移動します。以下を追加するとcompareTo()

System.out.println("Comparing, "+this+" to "+c);

印刷されます

Comparing, C9 to C1
Comparing, C9 to C5
Comparing, C9 to C7

問題は、C9が一致しないすべての要素の後にあることです。したがって、ツリーのC5に到達すると、compareToはそれが後であると言います。実際には、前を見る必要があり(C3に到達するため)、検索はツリーの間違ったパスをたどります。

于 2010-11-30T11:02:41.730 に答える
4

あなたのcompareTo()equals()メソッドは一貫していないため、TreeSetはそれらで正しく動作しません。

APIドキュメントから:

Set インタフェースを正しく実装するためには、セットによって維持される順序 (明示的なコンパレータが提供されているかどうかにかかわらず) は equals と一致している必要があることに注意してください。(equals との整合性の正確な定義については、Comparable または Comparator を参照してください。) これは、Set インターフェースが equals 操作に関して定義されているためですが、TreeSet インスタンスはその compareTo (または比較) メソッドを使用してすべての要素の比較を実行するためです。この方法で等しいと見なされる要素は、セットの観点からは等しいです。セットの動作は、その順序付けが equals と一致しない場合でも明確に定義されています。Set インターフェースの一般的な契約に従わないだけです。

于 2010-11-30T10:35:35.033 に答える
3

でのComparable実装はCoset、完全な順序付けを提供しません。

で順序を定義する必要があるようですvalue TreeSet。チェックの前または後のいずれかindex

于 2010-11-30T10:39:26.443 に答える