Что не так с моим java алгоритмом сортировки выбора? - PullRequest
0 голосов
/ 28 января 2020

Обновление: я поменял метод 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;
 }

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

1 Ответ

0 голосов
/ 28 января 2020

Ваши звонки 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);
...