Java竞赛排名输出

这个代码为什么不能实现成绩相同时,按照名字升序输出?
冬奥会自由式滑雪大跳台决赛的计分规则是:六名裁判给分(0-100分,整数分数),去掉一个最高分,去掉一个最低分,取平均值作为(除以4.0)参数选手得分(double类型);每位选手可以出场三次,取最高的两次得分和作为该选手的最终总分。

假设有12名选手参加自由式滑雪大跳台决赛,请你编写Java程序,根据每位选手每次出场的得分,计算选手总分,并按照总分降序排列输出选手的基本信息。如果总分相同,则按姓名升序排序。

说明1:字符串s与t比较大小使用s.compareTo(t),若返回值<0,则s串0,则s串>t串,若返回值为0,则s、t串相等。

说明2:计算每次的平均分时记得除以4.0而不是4,否则会视为整除,无法得到正确的结果



import java.util.Scanner;
//六位评委打分,求平均值
public class Main {
  public static void main(String[] args) {
      int[][] arr = new int[3][6];
      Scanner sc = new Scanner(System.in);
      Students [] students = new Students[12];
      for(int j=0;j<12;j++) {
          students[j]=new Students();
          String name= sc.next();
          String nati= sc.next();
          for(int u=0;u<3;u++) 
          { for (int i = 0; i < 6;i++) 
            {    int num = sc.nextInt();
               if(num>=0&&num<=100){ arr[u][i] = num; }
            }
          }
          students[j].setName(name);
          students[j].setNati(nati);
          double []sum = new double[3];double s=0;
          for (int i = 0;i<3;i++){
              //计算一个学生所有科目的范湖
              double[] max =new double[3];max[i]= arr[i][0];
              double []min =new double[3];min[i]= arr[i][0];
              for (int k = 0;k<6;k++){
                  //求一个学生的分数和
                  sum[i]+=arr[i][k];
                  //求一个学生的最高分
                  if (max[i] < arr[i][k]){
                      max [i]= arr[i][k];
                  }
                  //求一个学生的最低分
                  if (min[i] > arr[i][k]){
                      min[i] = arr[i][k];
                  }
              }
                  sum[i]=(sum[i]-min[i]-max[i])*1.0/4.0;
          }double min1=sum[0];
          for(int i=0;i<3;i++) {
              s+=sum[i];if(min1>sum[i])min1=sum[i];
          } s-=min1; 
          students[j].setScore(s);
      }Students temp;
          for(int i=0;i<12;i++)
          {
              for(int j=0;j<11-i;j++)
              {
                  if(students[j+1].getScore()>students[j].getScore())
                  {
                      temp=students[j];students[j]=students[j+1];students[j+1]=temp;
                  }
                  else if(students[j+1].getScore()==students[j].getScore())
                  {   
                      if( students[j].getName(  ).compareTo(  students[j+1].getName(  ))>0)
                      {
                          temp=students[j];students[j]=students[j+1];students[j+1]=temp;
                      }
                  }
              }
          }
          for(int i=0;i<12;i++) {
                    System.out.println(students[i].getName()+","+students[i].getNati()+","+students[i].getScore());
                }
  
}
}
class Students{
    
    private String name;private String nati;private double score;
    public void setName(String name) {
        this.name = name;
    }
    public void setNati(String nati) {
        this.nati = nati;
    }
    public String getName() {
        return name;
    }
    public String getNati() {
        return nati;
    }
    public void setScore(Double score) {
        this.score = score;
    }
    public Double getScore() {
        return score;
    }
}

在Student中实现排序接口,把名字和分数进行设置就行

 if( students[j].getName(  ).compareTo(  students[j+1].getName(  ))>0)

升序的话,你改成小于0试试

你把52行还是53行的改成这样

img


在前面加上包

img

该回答引用ChatGPT

以下是可以实现成绩相同时,按照名字升序输出的代码:


import java.util.*;

class Skier implements Comparable<Skier> {
    String name;
    double score;

    public Skier(String name, double score) {
        this.name = name;
        this.score = score;
    }

    public int compareTo(Skier other) {
        if (this.score != other.score) {
            return Double.compare(other.score, this.score); // 降序排列
        } else {
            return this.name.compareTo(other.name); // 如果总分相同,则按姓名升序排序
        }
    }

    public String toString() {
        return this.name + " " + String.format("%.1f", this.score);
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Skier[] skiers = new Skier[12];

        for (int i = 0; i < 12; i++) {
            String name = scanner.next();
            double[] scores = new double[3];
            for (int j = 0; j < 3; j++) {
                scores[j] = scanner.nextDouble();
            }
            Arrays.sort(scores);
            double totalScore = (scores[1] + scores[2]) / 2.0;
            skiers[i] = new Skier(name, totalScore);
        }

        Arrays.sort(skiers);

        for (int i = 0; i < 12; i++) {
            System.out.println(skiers[i]);
        }
    }
}

在 Skier 类中实现了 Comparable 接口,重写了 compareTo 方法,如果总分不同,则按总分降序排列,否则按照姓名升序排列。在输出时,直接使用 Arrays.sort 方法对 Skier 数组进行排序即可。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^