这个代码为什么不能实现成绩相同时,按照名字升序输出?
冬奥会自由式滑雪大跳台决赛的计分规则是:六名裁判给分(0-100分,整数分数),去掉一个最高分,去掉一个最低分,取平均值作为(除以4.0)参数选手得分(double类型);每位选手可以出场三次,取最高的两次得分和作为该选手的最终总分。
假设有12名选手参加自由式滑雪大跳台决赛,请你编写Java程序,根据每位选手每次出场的得分,计算选手总分,并按照总分降序排列输出选手的基本信息。如果总分相同,则按姓名升序排序。
说明1:字符串s与t比较大小使用s.compareTo(t),若返回值<0,则s串
说明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行的改成这样
该回答引用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 数组进行排序即可。
不知道你这个问题是否已经解决, 如果还没有解决的话: