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);
}
Это решение работает только в том случае, если вы предварительно сортируете сетку и не разрешаете прибегать к помощи пользователя. Я думаю, что вы уже сделали это.