java - 使用数组列表进行选择排序?

标签 java arraylist selection-sort

我必须适应学校的选择排序。目的是返回玩家的排名,获胜者在前,等等。排名相同的玩家应按照他们在锦标赛列表中出现的顺序列出。

public ArrayList<Player> ranking() {
    ArrayList<Player> result = new ArrayList<Player>();
    // Supply this code!
    return result;

现在这是我调整选择排序的尝试

    int smallInt = 0;
    int j=0;
    int smallIntIndex = 0;      

    for(int i=1;i<players.size();i++){
        smallInt = result.get(i-1).totalScore();
        smallIntIndex = i-1;
        for(j=i;j<players.size();j++){
            if(result.get(j).totalScore()<smallInt){
                smallInt = result.get(j).totalScore();
                smallIntIndex = j;                    
            }
        }
        int temp = result.get(smallIntIndex).totalScore();
        result.set(smallIntIndex, result.get(i-1));
        result.set(i-1, temp);
    }
    return result;

唯一给我错误的是最后一行

result.set(i-1, temp); //The method set(int, Player) in the type 
                       //ArrayList<Player> is not applicable for the arguments (int, int)

知道我做错了什么吗?大部分的适应都是正确的吗?感谢任何帮助。谢谢

附:请不要建议比较器或类似的东西,这不是我想要的。

最佳答案

有几件事:

  • 您正在初始化一个空的 result 数组,但该算法通过交换元素对现有数组起作用。您必须使用 players

    的值初始化 result
    List<Player> result = new ArrayList<Player>(players);
    
  • 变量 temp 类型必须是 Player 而不是 int

    Player temp = result.get(smallIntIndex);
    
  • 外循环必须从索引 0 开始,不能1

  • 外层循环必须以players.size() - 1结束
  • 内部循环必须从索引i+1开始
  • 每次在外循环中都交换元素,这是正确的。仅当找到新的最小值时才交换它们

更正后的代码:

public ArrayList<Player> ranking() {
    List<Player> result = new ArrayList<Player>(players);
    int smallInt = 0;
    int j=0;
    int smallIntIndex = 0;      

    for(int i=0;i<result.size() - 1;i++){
        smallInt = result.get(i).totalScore();
        smallIntIndex = i;
        for(j=i+1;j<result.size();j++){
            if(result.get(j).totalScore()<smallInt){
                smallInt = result.get(j).totalScore();
                smallIntIndex = j;                    
            }
        }

        if (i != smallIntIndex) {
            Player temp = result.get(smallIntIndex);
            result.set(smallIntIndex, result.get(i));
            result.set(i, temp);
        }
    }
    return result;
}

编辑:您要求排序后的结果必须进入一个单独的results数组,该数组最初是空的。这是一种方法:

public ArrayList<Player> ranking() {
    List<Player> result = new ArrayList<Player>();
    int smallInt = 0;
    int j=0;
    int smallIntIndex = 0;      

    for(int i=0;i<players.size() - 1;i++){
        smallInt = players.get(i).totalScore();
        smallIntIndex = i;
        for(j=i+1;j<players.size();j++){
            if(players.get(j).totalScore()<smallInt){
                smallInt = players.get(j).totalScore();
                smallIntIndex = j;                    
            }
        }

        if (i != smallIntIndex) {
            Player player = players.get(smallIntIndex);

            result.add(player);
            players.set(smallIntIndex, players.get(i));
        }
    }
    return result;
}

引用:Wikipedia's article on selection sort

关于java - 使用数组列表进行选择排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437626/

相关文章:

java - 打印 1-20 的数组,跨度为 10 的两个方法代码

java - 为 ArrayList 创建 setter

java - Java 中的选择排序产生不正确的结果

c++ - 为什么我的程序在选择排序功能后暂停?

java - 如何修改已运行的 Spring Hibernate 应用程序的数据库架构

java - TCP/IP(Java 应用程序到 SQL Server)

java - 没有验证证明无法创建 PhoneAuthCredential?

Java ArrayList<Double> 作为参数

java - 复制和修改另一个 ArrayList<Integer> java 的克隆的问题

c++ - 使用指针进行选择排序