2

Javaツリーセットが同一の要素を持つことはできないことを知っているので、同じ「値」を持っていても、何らかの方法で要素を別の要素と区別する必要があります。要素をランク付けできるようにしたいのですが、興味深い動作に気づいています。

TreeSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>()
        {
            public int compare(Integer arg0, Integer arg1) 
            {
                if(arg0 > arg1)
                    return -1;
                return 1;
            }
        });

        set.add(40);
            set.add(20);
        set.add(30);
            set.add(20);

        for(Integer i:set)
        {
            System.out.println("Rank: "+(set.headSet(i,false).size()+1)+" Number: "+i);
        } 

そしてこれは出力です:

Rank: 1 Number: 40
Rank: 3 Number: 30
Rank: 5 Number: 20
Rank: 5 Number: 20

これは、ヘッドセットが行うことになっていることです。

Returns a view of the portion of this set whose elements are less than (or equal to, if inclusive is true) toElement. The returned set is backed by this set, so changes in the returned set are reflected in this set, and vice-versa. The returned set supports all optional set operations that this set supports. 

私は降順でソートしているので、逆のことをするべきだと思います。最初の要素はそれよりも大きいものがないため、0を返し、次に1を追加してランクを取得します。2番目の要素はそれよりも1つ大きいので、1を返す必要があると思います。1を追加すると2になります。これはちょっと奇妙です。私は単純な間違いを犯していると思います。また、2つの20に対処する方法を理解する必要があります。私はそれらのランクを両方とも3にしたいのですが、ツリーセットはそれらが異なる数であると考えています。TreeMultiSetまたは他のサードパーティライブラリを使用できると思います。

4

2 に答える 2

2

比較の実装がコントラクトに違反しているため、2つの20が問題になります。

実装者は、すべてのxとyに対してsgn(x.compareTo(y))== -sgn(y.compareTo(x))を確認する必要があります。

x=20およびy=20の場合、これは実装では当てはまりません。1 ==-(1)

arg0.equals(arg1)の場合、0を返すことでこの問題を修正できます。

注:クラスIntegerのオブジェクトには、「==」の代わりに「equals」を使用する必要があります。

于 2010-11-20T20:33:44.603 に答える
0

TreeMultiSet または他のサードパーティ ライブラリを使用できると思います。

セットの基本的な特性の 1 つに違反しているので、少なくとも直接的にSetorを使用しないでください。TreeSetオプション:

  • a を使用しますList(そして Collections.sort() および Collections.binarySearch() でソートしたままにします)
  • IdentityHashMap を使用し、それ自体にマップされたキーとして値を使用するだけです
  • TreeMap を使用し、値を出現回数にマップします (リストに抽出し、必要に応じて並べ替えます)。
  • サードパーティのライブラリ (Bag または MultiSet) を使用する
  • 独自のバッグ/マルチセットを実装する

私はプログラミングのコンテキストについて詳しく知らないので、特定の解決策を提案するのは難しいですが、うまくいけば、これが考慮すべき他のアイデアをもたらすことを願っています.

于 2010-11-20T20:38:04.423 に答える