首页 > 解决方案 > 我的 java 选择排序算法有什么问题?

问题描述

更新:我已经将交换方法换成了 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;
 }

交换方法 印刷年龄 算法输出

标签: javaalgorithmsortingselectionselection-sort

解决方案


您的电话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);

推荐阅读