Vaadin Grid: как получить строку рейтинга - PullRequest
0 голосов
/ 01 января 2019

Я использую сетку для отображения рейтинга игроков.Список сортируется различными компараторами на сервере, но могут быть сценарии, в которых 2 строки имеют одинаковое ранжирование.В приведенном ниже примере первые две строки должны иметь номер # 1, а последние две должны быть оба # 2.

enter image description here

Я реализовал рейтинговые числа какследующий столбец:

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 ]

0 голосов
/ 14 января 2019

Этого можно добиться, немного изменив код в вашем методе 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);
}

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

0 голосов
/ 01 января 2019

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

(добавить 10) {10} -> 1

(добавить 10) {10} -> 1

(добавить 0) {10, 0} -> 2

(Добавить 0) {10,0} -> 2

...