怎么排序?怎么重复输入?


package 第六次作业;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class 比赛评分排序 {
static Scanner sc =new Scanner( System .in);
    public static void main(String[] args) {
        System.out.println("请输入参赛选手个数");
        int n = sc.nextInt();
        // TODO 自动生成的方法存根
        //假设在某次比赛中,有10名评委,对每名参赛选手的评分规则为:
//每名评委在区间[0,10]给出评分,在10个分数中去掉一个最高分,
//去掉一个最低分,平均剩下的8个分数为参赛选手的最终得分。
//一共N名参赛选手,N随机输入,请分析以上要求,
//用所学Java图形用户界面知识,设计一个图形用户界面(GUI)。
//        实现以下基本功能: 
//        (1)建立两个输入框,用于输入当前参赛选手的编号与姓名;
//        (2)建立十个输入框,用于输入评委对参赛选手的评分;
//        (3)建立一个输出框,用来显示当前参赛选手的最后得分;
//        (4)建立一个输出框,用来显示所有参赛选手的结果并实现排序
        JFrame frame = new JFrame("评分排序");
        frame.setBounds(300200500400);
        frame.setLayout(new BorderLayout());
        
        Panel a1 = new Panel();
        a1.setBackground(Color.LIGHT_GRAY);
        frame.add(a1,BorderLayout.NORTH);
        a1.setLayout(new FlowLayout(FlowLayout.CENTER,50,50));
        
        JLabel b1 = new JLabel("编号:");
        TextField c1 = new TextField(20);
    
        JLabel b2 = new JLabel("姓名:");
        TextField c2 = new TextField(20);
        
        a1.add(b1);
        a1.add(c1);
        a1.add(b2);
        a1.add(c2);
        
        

    
    Panel a2 = new Panel();
    a2.setBackground(Color.GRAY);
        frame.add(a2,BorderLayout.CENTER);
        a2.setLayout(new FlowLayout(FlowLayout.CENTER,55,60));
        
        JLabel b3 = new JLabel("评分1:");
        TextField c3 = new TextField(10);
        
        JLabel b4 = new JLabel("评分2:");
        TextField c4 = new TextField(10);
        
        JLabel b5= new JLabel("评分3:");
        TextField c5 = new TextField(10);
        
        JLabel b6 = new JLabel("评分4:");
        TextField c6 = new TextField(10);
        
        JLabel b7 = new JLabel("评分5:");
        TextField c7 = new TextField(10);
        
        JLabel b8 = new JLabel("评分6:");
        TextField c8 = new TextField(10);
        
        JLabel b9 = new JLabel("评分7:");
        TextField c9= new TextField(10);
        

        JLabel b10= new JLabel("评分8:");
        TextField c10 = new TextField(10);
        
        JLabel b11 = new JLabel("评分9:");
        TextField c11 = new TextField(10);
        
        JLabel b12 = new JLabel("评分10:");
        TextField c12= new TextField(10);
        
        a2.add(b3);
        a2.add(c3);
        a2.add(b4);
        a2.add(c4);
        a2.add(b5);
        a2.add(c5);
        a2.add(b6);
        a2.add(c6);
        a2.add(b7);
        a2.add(c7);
        a2.add(b8);
        a2.add(c8);
        a2.add(b9);
        a2.add(c9);
        a2.add(b10);
        a2.add(c10);
        a2.add(b11);
        a2.add(c11);
        a2.add(b12);
        a2.add(c12);
        
        //显示所有选手总分
        Panel a3 = new Panel();
        a3.setBackground(Color.LIGHT_GRAY);
        frame.add(a3,BorderLayout.SOUTH);
        a3.setLayout(new FlowLayout(FlowLayout.LEFT,110,60));
        a3.setPreferredSize(new Dimension(500,300));
        
        Button button  = new Button("计算成绩");
        button.setSize(55);
        a3.add(button);
        JLabel b13 = new JLabel("总成绩");
        TextField c13 = new TextField(100);
        
        JLabel b14 = new JLabel("总成绩排名");
        TextField c14 = new TextField(100);
        
        a3.add(b13);
        a3.add(c13);
        
        a3.add(b14);
        a3.add(c14);
        
        frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    button.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO 自动生成的方法存根
            for(int i= 0;i<n;i++) {
                String id = c1.getText();
                String name = c2.getText();
                
                int s1 = Integer.parseInt(c3.getText());
                int s2 = Integer.parseInt(c4.getText());
                int s3 = Integer.parseInt(c5.getText());
                int s4 = Integer.parseInt(c6.getText());
                int s5 = Integer.parseInt(c7.getText());
                int s6 = Integer.parseInt(c8.getText());
                int s7 = Integer.parseInt(c9.getText());
                int s8 = Integer.parseInt(c10.getText());
                int s9 = Integer.parseInt(c11.getText());
                int s10 = Integer.parseInt(c12.getText());
                
                int [] arr = {s1,s2,s3,s4,s5,s6,s7,s8,s9,s10};
                
                int max = arr[0];
                int min = arr[0];
                int m=0;
                int n=0;
                for(int j=1;j<arr.length;j++) {
                    if(arr[j]>max) {
                        max=arr[j];
                        m=j;
                    }
                    if(arr[j]<min) {
                        min=arr[j];
                        n=j;
                    }
                }
                arr[m]=0;
                arr[n]=0;
                int total = 0;
                for(int k=0;k<arr.length;k++) {
                    total+=arr[k];
                }
                int ave = total/(n-2);
                c13.setText("编号:"+id+"姓名:"+name+"总成绩:"+ave);
                
            }
            
        }
    });
    }

}

该回答引用GPT4的Plus-8K模型:要实现排序功能,可以在计算平均分后,将选手的信息(如编号、姓名和成绩)存储在一个对象中。然后,将这些对象存储在一个列表中,并对该列表进行排序。在Java中,可以使用Collections.sort()方法对列表进行排序。首先,为选手信息创建一个类,并实现Comparable接口:

class Contestant implements Comparable<Contestant> {
    String id;
    String name;
    int score;

    public Contestant(String id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    @Override
    public int compareTo(Contestant o) {
        return o.score - this.score;
    }
}

然后,在比赛评分排序类中,创建一个ArrayList来存储选手信息。在计算平均分后,将选手信息添加到列表中:

ArrayList<Contestant> contestants = new ArrayList<>();
// 在计算平均分后
int ave = total / (n - 2);
contestants.add(new Contestant(id, name, ave));

接下来,需要对contestants列表进行排序,并将排序后的结果显示在输出框中。可以在actionPerformed方法中添加以下代码:

Collections.sort(contestants);
StringBuilder sb = new StringBuilder();
for (Contestant contestant : contestants) {
    sb.append("编号: ").append(contestant.id).append(" 姓名: ").append(contestant.name).append(" 总成绩: ").append(contestant.score).append("\n");
}
c14.setText(sb.toString());

这样,在点击“计算成绩”按钮后,选手的成绩将按降序排列,并显示在输出框中。注意,这个实现中,每次点击按钮都会添加一个新的选手到列表中,请确保在添加新选手之前清除输入框的内容。

你的代码中存在一些问题,我将会一一指出并给出解决方案:

  1. 排序问题:你的代码中并没有实现排序功能。你需要将每个选手的总成绩存储在一个列表或数组中,然后对这个列表或数组进行排序。你可以使用Java的Arrays.sort()方法或者Collections.sort()方法来进行排序。

  2. 重复输入问题:你的代码中并没有实现重复输入功能。你的代码只能为一个选手输入评分,然后计算总成绩。如果你想为多个选手输入评分,你需要在你的代码中添加一个循环,让用户可以多次输入。

  3. 显示所有选手总成绩:你的代码中并没有实现显示所有选手总成绩的功能。你需要将每个选手的总成绩存储在一个列表或数组中,然后在你的GUI中显示这个列表或数组。

  4. 计算平均分问题:你的代码中计算平均分的部分存在问题。你应该用总分除以8(因为你去掉了一个最高分和一个最低分),而不是除以n-2。

  5. GUI设计问题:你的GUI设计存在一些问题。你为每个评委都创建了一个输入框,这可能会导致你的GUI过于复杂。你可以考虑使用一个文本区域(JTextArea)来让用户输入所有评委的评分,然后在你的代码中解析这些评分。

以上是对你代码存在问题的一些解答,希望对你有所帮助。如果你需要更具体的帮助,例如如何修改你的代码来实现上述功能,欢迎你提供更多的信息。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7428033
  • 这篇博客你也可以参考下:什么是沾包?如何处理?
  • 除此之外, 这篇博客: 什么是冒泡排序?中的 什么是冒泡排序? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 最近开始重学算法。先从最简的冒泡排序开始。这里做个笔记方便后面复习。

    对于冒泡排序算法的定义,相对于其他资料,百度百科里的介绍相对详细一点——冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

    它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

    这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

    结论——冒泡排序它通过交换数据元素的位置进行排序,是一种典型的交换排序算法。

  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 详细设计使用招数小节, 巩固相关知识点