gpt4 book ai didi

java - TreeSet 中的排名元素

转载 作者:行者123 更新时间:2023-11-30 09:52:30 25 4
gpt4 key购买 nike

我知道 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 得到它的排名。第二个元素有一个比它大的东西,所以我认为它应该返回 1,加 1 得 2。这有点奇怪。我想我犯了一个简单的错误。我还需要弄清楚如何处理这两个 20 岁。我希望它们的等级都是 3,但树集认为它们是不同的数字。我想我可以使用 TreeMultiSet 或其他一些第三方库。

最佳答案

这两个 20 是个问题,因为您的比较实现违反了 the contract :

The implementor must ensure sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) for all x and y.

如果 x=20 和 y=20,这在您的实现中是不正确的:1 == -(1)

如果 arg0.equals(arg1),您可以通过返回 0 来解决这个问题。

注意:对于 Integer 类的对象,您需要使用“等于”而不是“==”。

关于java - TreeSet 中的排名元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com