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または他のサードパーティライブラリを使用できると思います。