#java #spring #algorithm #hibernate #sorting
#java #spring #алгоритм #спящий режим #сортировка
Вопрос:
Я использую Hibernate 4.3.0, Spring 4 и JDK 7. Итак, в основном у меня есть Player
class Player
long id
int rank
string name
И, например, есть 5 игроков, упорядоченных от 1 до 5 соответственно.
P1 #1
P2 #2
P3 #3
P4 #4
P5 #5
Теперь я хочу назначить P3
rankof #10
. Изначально это было бы
P1 #1
P2 #2
P3 #10
P4 #4
P5 #5
Но каков мой желаемый результат:
P1 #1
P2 #2
P4 #3
P5 #4
P3 #5
Итак, я хочу, чтобы все те, кто ранее был ранжирован ниже, чем P3
для перемещения вверх ( P4 #4 moves up to #3 and P5 #5 moves up to #4
), а затем для вновь назначенных P3
вместо этого использовали следующий доступный рейтинг ( #5
) .
Итак, в настоящее время я планирую сделать, например, в этом случае
changeRankRequest(player, rank) {
int previousRank = player.rank;
for each p in playerList
if p.rank > previousRank
then
p.rank = 1 // moving it down the rank
sort(playerList)
lowestRankingPlayer = findLowestRank(playerList)
player.rank = lowestRankingPlayer.rank 1;
database.batchUpdate(playerList)
}
Я уверен, что это не лучший способ сделать это. И это не подходит для другого случая, когда я присваиваю игроку уже принятый ранг, тогда все остальные ранги должны соответственно меняться.
Комментарии:
1. Одним из предложений было бы использовать большие числа для ранга в базе данных, например 1000, 2000, 3000 и т.д., и преобразовать ранги базы данных для отображения рангов, например 1, 2, 3, 4 и т.д. когда вы извлекаете строки. Когда вы используете большие номера рангов, вы можете вставлять и изменять рейтинги для отдельных игроков без необходимости обновлять всю таблицу.
Ответ №1:
может обновляться с помощью sql (mysql):
set @x=0;
UPDATE Player t1
INNER JOIN(
SELECT id,@x:=ifnull(@x,0) 1 as rank
FROM Player t
where t.rank <= #{currentRank}
ORDER BY t.rank
) t2 ON t1.id=t2.id
SET t1.rank=t2.rank
если вам нужно отсортировать все, удалите where t2.rank <= #{currentRank}