Vaadin Grid:如何获得排名行

Vaadin Grid: How to have a Ranking row

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

创建一个 TreeSet 并将每一行的点添加到集合中。使用集的长度来return排名。

(加 10){10} -> 1

(加 10){10} -> 1

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

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

这可以通过在您的 getRowIndex 方法中稍微更改代码来实现(我将其命名为 getRanking 因为它不再是一个简单的索引)。诀窍是存储 current/iterated 行的 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);
}

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