我知道一个java treeset不能有相同的元素,所以我必须以某种方式区分一个元素,即使它们具有相同的“值”。我希望能够排列元素,并且我注意到一个有趣的行为。TreeSet中的排名元素
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来得到它的等级。第二个元素有一个比它大的东西,所以我认为它应该返回1,加1就是2.这很奇怪。我想我犯了一个简单的错误。我还需要弄清楚如何处理这两个20年代。我希望他们的排名都是3,但是treeset认为他们是不同的数字。我想我可以使用TreeMultiSet或其他第三方库。
这是一个很好的观点。我可以尝试使用常规列表并保持排序 – JPC 2010-11-21 00:10:16