Я хочу сделать таблицу лидеров с помощью SQL.
Поэтому мне нужно ЗАКАЗАТЬ с помощью kills
в моем случае, чтобы отсортировать результаты.
Но с результирующим набором порядок неправильный.
HashMap<String, Integer> player_list = new HashMap<>();
preparedStatement = this.pvpBox.getDtb().getConnection().prepareStatement(
"SELECT player_name, kills FROM players ORDER BY kills DESC LIMIT 10");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
player_list.put(resultSet.getString("player_name"), resultSet.getInt("kills"));
}
Нет сообщения об ошибке.
Я уже пробовал в разделе «SQL» PHPMyAdmin, и я получаю ожидаемый результат.
Пример таблицы:
player_name kills player1 40 player2 20 player3 50 player4 10 player5 30
Фактический результат :
player_name kills player5 30 player1 40 player4 10 player2 20 player3 50
Ожидаемый результат :
player_name kills player3 50 player1 40 player5 30 player2 20 player4 10
Я использую Java 8 и Apache 2.
Решение. Используйте LinkedHashMap вместо HashMap (у хэш-карты нет никакого порядка).
попробуйте SELECT player_name, убивает ОТ игроков ORDER BY убивает DESC без ограничений. не уверен, что это поможет, но стоит попробовать, я думаю
@ Алан, лимит не должен мешать этому.
Вы пытались распечатать результаты внутри цикла while, чтобы убедиться, что они верны? Как указал @Andronicus, это может быть вызвано неправильной реализацией List
@lealceldeiro я знаю. но кто знает, может быть, это одна из тех странных вещей
результат SQL-запроса в порядке?.. в чем проблема? в списке SQL или Java?
но ждать. я вижу, что он использует реализацию карты. может в этом причина
player_list.put
похоже, что вы используете карту для хранения результатов, а не список, карта не имеет порядка (в большинстве случаев).
@luk2302 точно
@ Алан, ты попал в точку, чувак. Кажется, это проблема
КЛЮЧЕВОЙ (каламбур) вопрос: можем ли мы найти способ сделать это, сохранив реализацию его карты? потому что изменение всего на тип списка может испортить весь его код (конечно, в зависимости от реальной ситуации)
Совершенно очевидно, что player_list
, который вы используете, не является List
. С методом put()
и двумя аргументами это выглядит как Map
.
Если вы используете HashMap
, неудивительно, что порядок произвольный — HashMap
не сохраняет никакого порядка.
Вам может понадобиться LinkedHashMap
или вообще другая структура данных, например пользовательский объект, который вы затем фактически сохраните в списке, а не на карте.
Исходный вопрос хотел бы прокомментировать: он отлично работает с LinkedHashMap! Тема раскрыта!
Я думаю, что проблема связана с player_list, который представляет собой несортированную реализацию карты. Если вы хотите сохранить порядок вставок на карте, используйте LinkedHashMap.
Является ли player_list объектом хэш-карты? Hashmap не поддерживает порядок вставленных значений. Вместо этого попробуйте использовать LinkedHashMap или TreeMap.
Какую
List
реализацию вы используете? Он может не отслеживать порядок размещения.