Каков эффективный способ сжатия и сортировки объектов по ранжированию?

#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}