Что не так с моим алгоритмом сортировки выбора Java?

Обновление: я заменил метод swap на метод Collection.swap, и теперь все работает. Спасибо за помощь.

У меня есть алгоритм сортировки выбором, целью которого является сортировка баскетболистов по возрасту. programPlayerList — это несортированный список массивов баскетболистов, взятых из CSV-файла, который был извлечен из Интернета. programSortedPlayerList — это список-массив, который должен содержать игроков в зависимости от их отсортированного возраста. swap — это метод, который меняет местами объекты игрока. Однако, когда я запускаю код, игроки неправильно отсортированы. Что не так с моим кодом?

public static ArrayList<Player> sortByAge() {   
    for(int i = 0; i < programPlayerList.size(); i++) {
        programSortedPlayerList.add(programPlayerList.get(i));
    }

    for(int i = 0; i < programSortedPlayerList.size()-1; i++) {
        int indexofmin = i;
        for(int j = i+1; j < programSortedPlayerList.size(); j++) {
            if(programSortedPlayerList.get(j).getAge() < programSortedPlayerList.get(indexofmin).getAge()) {
                indexofmin = j;
            }
        }
        swap(programSortedPlayerList.get(i), programSortedPlayerList.get(indexofmin));
    }
    return programSortedPlayerList;
 }

Метод замены Возраст печати Вывод алгоритма


person Tashi Carter    schedule 28.01.2020    source источник
comment
Где вы печатаете? И как? Кроме того, swap выглядит неправильно (поскольку вы передаете ему ссылки).   -  person Elliott Frisch    schedule 28.01.2020
comment
swap — это метод, который меняет местами объекты плеера — также включите код для этого метода. игроки отсортированы неправильно — укажите ввод, фактический и ожидаемый результаты. См. минимально воспроизводимый пример.   -  person kaya3    schedule 28.01.2020
comment
Я внес изменения. Что-то еще нужно?   -  person Tashi Carter    schedule 28.01.2020
comment
Привет, добро пожаловать в SO. Включение вашего кода непосредственно в ваши вопросы (вместо ссылки на его скриншоты) облегчит его чтение потенциальным ответчикам.   -  person MikaelF    schedule 28.01.2020
comment
Хорошо, верно подмечено.   -  person Tashi Carter    schedule 28.01.2020
comment
Возможно, вы правильно заметили, но спустя 7 часов у вас все еще есть скриншоты кода, а не код в виде текста.   -  person trincot    schedule 28.01.2020


Ответы (1)


Ваши звонки swap ничего не изменят в programSortedPlayerList.

Аргументы, переданные swap, не изменяются им. Как только вы назначаете новый объект любой переменной-аргументу, вы получаете только локальный эффект. Вызывающий код не увидит никаких изменений в переданных объектах. Это принцип "вызова по значению": объекты (ссылки) передаются swap, но что бы ни делал swap, он не может изменить ссылки вызывающего.

Чтобы изменить порядок элементов в programSortedPlayerList, в какой-то момент вам придется вызвать programSortedPlayerList.set.

Так, например:

public static void swap(ArrayList<Player> playerList, int i, int j) {
    Player temp = playerList.get(i);
    playerList.set(i, list.get(j));
    playerList.set(j, temp);
}

... и вызовите как:

swap(programSortedPlayerList, i, indexofmin);
person trincot    schedule 28.01.2020