Java 瓦丁网格:如何拥有排名行

Java 瓦丁网格:如何拥有排名行,java,vaadin-grid,vaadin12,Java,Vaadin Grid,Vaadin12,我用网格显示球员的排名。该列表由后端的各种比较器进行排序,但仍可能存在两行具有相同排名的情况。在下面的示例中,前两行的数字应为#1,后两行的数字均为#2 我将排名数字作为一列执行,如下所示: rankings.addColumn(this::getRowIndex).setWidth("2em") .setResizable(true); 使用此方法: private String getRowIndex(TeamHasFormatRecord thfr) {

我用网格显示球员的排名。该列表由后端的各种比较器进行排序,但仍可能存在两行具有相同排名的情况。在下面的示例中,前两行的数字应为#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()

创建树集并将每行的点添加到树集。使用集合的长度返回秩

(加10){10}->1

(加10){10}->1

(添加0){10,0}->2


(添加0){10,0}->2

这可以通过在
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);
}

此解决方案只有在您事先对网格进行排序并且不允许从用户处重新排序时才有效。我想你已经这样做了。

这不起作用,因为比较不仅仅是点。你可能有相同数量的点,但不同的平均值和标准差。从软件架构的角度来看,我认为在网格渲染器中尝试解决这一问题可能是错误的方法。相反,我将把实现放到业务模型级别。例如,创建DTO,它将排名作为属性之一,并由业务逻辑计算。我会按照Tatu的建议做。让等级成为player类(或其DTO)的一个属性。我几乎可以肯定,在其他情况下,你也需要玩家的排名,使用网格排序顺序计算移动中的排名肯定会产生与你一样的问题。别误会,你的要求是可能的(把
index++;
放在if语句中,检查是否相等),但如果业务模型更完整,就没有必要了。你也不必多次计算玩家的等级。我不认为把它作为一个属性是解决办法。因为这是持久化到数据库的,所以每次匹配发生时,所有条目都可能需要修改。这听起来不可伸缩。此外,排名取决于你所看到的,所以它不是直接的。取决于哪种游戏,哪种格式,等等。这实际上是有意义的。我猜你的应用程序比我想象的要复杂一点——很抱歉假设不是这样!这是事先分类的,但我允许诉诸。否则的话,它似乎会起作用。事实上,我不能100%肯定它在客户端求助后是否会起作用。可能是它保持了正确的排名。也许值得一试