我正在使用网格显示玩家排名。该列表由后端的各种比较器进行排序,但是可能仍然存在两行具有相同排名的情况。在下面的示例中,前两行的编号应为#1,后两行的编号均应为#2。
我将排名数字实现为以下列:
rankings.addColumn(this::getRowIndex).setWidth("2em")
.setResizable(true);
使用此方法:
private String getRowIndex(TeamHasFormatRecord thfr)
{
index++;
return String.valueOf(index);
}
这是一个基本的计数器。我能想到的唯一方法是基本上获取每个条目并将其放在列表中,但我认为这可能太繁重且无法很好地升级。
有什么建议吗?
更新 这是当前的比较器:
Comparator.comparingDouble((TeamHasFormatRecord thfr) -> thfr.getPoints())
.thenComparingDouble(thfr -> thfr.getMean())
.thenComparingDouble(thfr -> thfr.getStandardDeviation())
.reversed()
答案 0 :(得分:1)
创建一个TreeSet并将每行中的点添加到集合中。使用集合的长度返回排名。
(加10){10}-> 1
(加10){10}-> 1
(添加0){10,0}-> 2
(加0){10,0}-> 2
答案 1 :(得分:1)
这可以通过在您的getRowIndex
方法中更改代码来实现(我将其命名为getRanking
,因为它不再是简单的索引了)。诀窍是存储当前行/迭代行的thfr,以便与下一行进行比较。 如果他们的得分相同,请不要提高排名。
// class fields
private TeamHasFormatRecord lastIteratedThfr;
private int ranking = 0;
private String getRanking(TeamHasFormatRecord thfr)
{
// hasSameScore() will check for equal points, mean, and standardDerivation.
if(lastIteratedThfr == null || !thfr.hasSameScore(lastIteratedThfr)){
ranking++;
}
lastIteratedThfr = thfr; // store this thfr for the next thfr to compare to
return String.valueOf(ranking);
}
此解决方案仅在您事先对网格进行排序并且不允许用户使用时才有效。我想您已经做到了。