Vaadin Grid: как получить строку рейтинга

Я использую сетку, чтобы показать рейтинг игроков. Список сортируется различными компараторами на сервере, но могут быть сценарии, в которых 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()

2 ответа

Создайте TreeSet и добавьте точку из каждой строки в набор. Используйте длину набора, чтобы вернуть ранг.

(Добавить 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);
}

Это решение работает только в том случае, если вы предварительно сортируете сетку и не разрешаете прибегать к помощи пользователя. Я думаю, что вы уже сделали это.

Другие вопросы по тегам