首页 > 其他分享 >OOP题目集总结

OOP题目集总结

时间:2023-06-21 11:23:13浏览次数:38  
标签:总结 题目 String name course OOP student public split

目录

一、前言

           (1)第七次题目集

                 一道题目,菜单5

           (2)第八次题目集

                 一道题目,课程成绩统计系统1

           (3)第九次题目集

                 一道题目,统计Java程序中关键词的出现次数(必须使用map和set)

           (4)第十次题目集

                 四道题目,容器-HashMap-检索、容器-HashMap-排序、课程成绩统计程序-2、动物发声模拟器(多态),考点是HashMap的使用和对多态的理解

           (5)第十一次题目集

                 五道题目,容器-ArrayList-排序、课程成绩统计程序-3、jmu-Java-02基本语法-03-身份证排序、jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack、jmu-Java-03面向对象基础-05-覆盖,对javase语法更深入的了解

二、设计与分析

     7.5

 

                这次的作业在菜单计价程序-3的基础上增加了特色菜系,每桌菜都有点订单的人名和电话号码,不同于菜单计价程序-4中的特色菜,菜单计价程序-5的特色菜有川菜、晋菜、浙菜之分,而且增加了口味度,在最后对每桌菜订单数据的输出增加了按英文字典顺序输出。首先处理人名、电话数据,由于人名和电话是和订单桌号相联系又对应关系的,我认为人名和电话应该属于table类中的属性,只需要在table类中加入人名、电话号属性即可,又因为每一桌的订单都有可能有特色菜及其口味度,所以又需要增加特色菜数和口味度属性,table类更改代码如下

 

 

 又因为最后还要进行按人名用英文字典顺序输出,所以要用到每个table类中的name属性,这时排序的工作如果仍然用table类来完成显然有些不太合适,所以我创建了一个shop类,既能储存每个table类的数据,也能调用各个table类中的数据完成排序、输出数据等操作

 

 

 

 而排序通过冒泡排序法和compareTo方法来完成,shop类中的tnum为桌号的角标,用以记录table的数量

 

接下来轮到特色菜的处理,受菜单计价程序-4的启发,我发现点普通菜、点特色菜、代点普通菜、代点特色菜能够用一个方法合并,代码如下

 

 

 

 

 首先对是否有该菜品做判断,然后对特色菜、普通菜输入格式是否正确(特色菜以普通菜的格式输入的错误)做判断,如果都没问题则将数据进行储存处理,然后再看是否是特色菜,如果是,将对该条数据进行特色菜处理

 

至此大部分的代码以及修改完毕,只需要改main方法即可

 

由于做这次作业,并没有大量异常输入,并且发现用正则表达式会更简洁,而菜单计价程序-3的main类对数据的处理方面太差,我决定用正则表达式来完成数据的处理。在之前的学习中我了解了正则表达式的用法,首先格式的配对用matches方法,matches判断是否相等boolean返回值,substring[]看字符位置如【0,1】是首位,以此类推、\\d表示配对数字(字符型)"+"代表多位、\\s表示配对空格也可以直接输入空格、\\w表示配对单个字母、\\D表示配对除数字外任何单个字符(包括中文)、[\u4e00-\u9fa5]+匹配多个中文,有了这个知识点作为基础,于是main类对数据的处理就有了如下代码的更改

 

 

对菜品输入的处理分为普通菜、特色菜、错误输入,通过while循环来进行菜品的不断输入储存等处理,如果输入的数据分割后的第一个字符串为table说明菜品的输入结束,接下来是订单数据处理,代码如下

 

 

 

 

 通过如上操作可以完成点普通菜、点特色菜、代点普通菜、代点特色菜、删菜的数据处理,同时也完成了菜单超时、菜单格式错误的操作

 

这次没拿到满分的原因我也不知道,就是有三分怎么都拿不到,想过很多异常情况,但都不是考点。

 

      8.1

某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

 

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

 

考察的总成绩直接等于期末成绩

 

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

 

1、输入:

 

包括课程、课程成绩两类信息。

 

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

 

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

 

课程性质输入项:必修、选修

 

考核方式输入选项:考试、考察

 

课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

 

课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

 

以上信息的相关约束:

 

1)平时成绩和期末成绩的权重默认为0.3、0.7

 

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

 

3)学号由8位数字组成

 

4)姓名不超过10个字符

 

5)课程名称不超过10个字符

 

6)不特别输入班级信息,班级号是学号的前6位。

 

2、输出:

 

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

 

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

 

1)学生课程总成绩平均分按学号由低到高排序输出

 

格式:学号+英文空格+姓名+英文空格+总成绩平均分

 

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

 

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

 

格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

 

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

 

3)班级所有课程总成绩平均分按班级由低到高排序输出

 

格式:班级号+英文空格+总成绩平均分

 

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

 

异常情况:

 

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

 

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

 

以上两种情况如果同时出现,按第一种情况输出结果。

 

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

 

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

 

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

 

信息约束:

 

1)成绩平均分只取整数部分,小数部分丢弃

import java.util.*;
import java.util.ArrayList;
import java.text.Collator;

public class Main {
    public static void main(String[] args) {
         String s1 = "[\\u4e00-\\u9fa5\\w]{1,10} (必修|(必修 考试)|(选修 考试)|(选修 考察)|(必修 考察))";  //匹配课程信息
        String s2 = "\\d{8} [\\u4e00-\\u9fa5\\w]{1,10} [\\u4e00-\\u9fa5\\w]{1,10}( )?(100|0|[1-9]([0-9])?)? (100|0|[1-9]([0-9])?)"; //匹配学生信息
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        AllCourse  allCourse = new AllCourse();
        ArrayList<Class> classes = new ArrayList<>();
        //处理输入数据
        while(!input.equals("end")){
            String[] split = input.split(" ");
            if(input.matches(s1)){    //添加课程信息
                //防止重复
                boolean flag = true;
                for(Course course : allCourse.courses){
                    if(split[0].equals(course.getName())){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    if(split[1].equals("必修") && split[2].equals("考察")){
                        System.out.println(split[0]+" : course type & access mode mismatch");
                    }else if(split.length == 3){
                        allCourse.addCourse(split[0],split[1],split[2]);
                    }else if(split.length == 2){
                        allCourse.addCourse(split[0],split[1]);
                        }
                }
            }else if(input.matches(s2)){
                    //防止重复信息
                    boolean flag1 = true;
                    boolean isSame = false;
                    for(Class c : classes){
                        for(Student student : c.students){
                            if(student.getNum().equals(split[0]) && student.getName().equals(split[1])){
                                isSame = true;
                                for (Course course : student.courses){
                                    if(course.getName().equals(split[2])){
                                        flag1 = false;
                                        break;
                                    }
                                }
                                if(!flag1){
                                    break;
                                }
                            }
                        }
                        if(!flag1){
                            break;
                        }
                    }
                    if(flag1){
                        boolean flag2 = false;
                        int i ;
                        for(i = 0; i < classes.size();i++){
                            if(classes.get(i).getClassNum().equals(split[0].substring(0,6))){//存在该班级,直接添加学生信息
                                flag2 = true;
                                break;
                            }
                        }

                        if(allCourse.findCourse(split[2]) == null){
                            System.out.println(split[2] + " " + "does not exist");
                            if(flag2){
                                if(!isSame){
                                    classes.get(i).addStudent(split[0],split[1]);
                                }
                            }else{
                                classes.add(new Class(split[0]));
                                classes.get(classes.size()-1).addStudent(split[0],split[1]);
                            }
                        }else if((allCourse.findCourse(split[2]).getMode().equals("考试") && split.length == 4) || (allCourse.findCourse(split[2]).getMode().equals("考察") && split.length == 5)) {
                            System.out.println(split[0] + " " + split[1] + " " + ": access mode mismatch");
                            if (flag2) {
                                if(!isSame){
                                    classes.get(i).addStudent(split[0], split[1]);
                                }
                            } else {
                                classes.add(new Class(split[0]));
                                classes.get(classes.size() - 1).addStudent(split[0], split[1]);
                            }
                         }else{
                            if(split.length == 5){
                                if(flag2){
                                    if(isSame){
                                        classes.get(i).findStudent(split[0]).courses.add(new Course(split[2],Integer.parseInt(split[3]),Integer.parseInt(split[4])));
                                    }else{
                                        classes.get(i).addStudent(split[0],split[1],split[2],Integer.parseInt(split[3]),Integer.parseInt(split[4]));
                                    }
                                }else{
                                    classes.add(new Class(split[0]));
                                    classes.get(classes.size()-1).addStudent(split[0],split[1],split[2],Integer.parseInt(split[3]),Integer.parseInt(split[4]));
                                }
                            }else if(split.length == 4){
                                if(flag2){
                                    if(isSame){
                                        classes.get(i).findStudent(split[0]).courses.add(new Course(split[2],Integer.parseInt(split[3])));
                                    }else{
                                        classes.get(i).addStudent(split[0],split[1],split[2],Integer.parseInt(split[3]));
                                    }
                                }else{
                                    classes.add(new Class(split[0]));
                                    classes.get(classes.size()-1).addStudent(split[0],split[1],split[2],Integer.parseInt(split[3]));
                                }
                            }
                        }
                    }
            }else{
                System.out.println("wrong format");
            }

            input = sc.nextLine();
        }

        //处理输出数据
        //排序由低到高
        Collections.sort(classes);
        for(Class x : classes){
            Collections.sort(x.students);
        }
      Collections.sort(allCourse.courses);

        //输出学生成绩
        for(Class c : classes){
           for(Student student : c.students){
               if(student.courses.size() == 0){
                   System.out.println(student.getNum()+" "+student.getName()+" "+"did not take any exams");
               }else{
                   c.setR(true);
                   System.out.println(student.getNum()+" "+student.getName()+" "+(int)(student.getScore(allCourse)));
               }
           }
        }
        //输出科目
        for(Course course : allCourse.courses){
            if(course.isR()){
                float assessmentScore = 0;
               float examinationScore = 0;
                int count = 0;
                for(Class c : classes){
                    for(Student student : c.students){
                        if(student.findCourse(course.getName()) != null){
                            if(course.getMode().equals("考试")){
                                assessmentScore += student.findCourse(course.getName()).getAssessmentScore();
                                examinationScore += student.findCourse(course.getName()).getExaminationScore();
                            }else if(course.getMode().equals("考察")){
                                examinationScore += student.findCourse(course.getName()).getExaminationScore();
                            }
                            count++;
                        }
                    }
                }
                if(course.getMode().equals("考试")){
                    System.out.println(course.getName()+" "+(int)(assessmentScore/count)+" "+(int)(examinationScore/count)+" "+(int)((assessmentScore*0.3+examinationScore*0.7)/count));
                }else if(course.getMode().equals("考察")){
                    System.out.println(course.getName()+" "+(int)(examinationScore/count)+" "+(int)(examinationScore/count));
                }
            }else{
                System.out.println(course.getName()+" "+"has no grades yet");
            }
        }
        //输出班级成绩
        for(Class c : classes){
            if(c.isR()){
                System.out.println(c.getClassNum()+" "+c.getScore(allCourse));
            }else{
                System.out.println(c.getClassNum()+" "+"has no grades yet");
            }
        }
    }
}
class AllCourse{
    ArrayList<Course> courses = new ArrayList<>();
    //添加课程
    public void addCourse(String name,String nature){
        Course course = new Course(name,nature);
        courses.add(course);
    }

    public void addCourse(String name,String nature,String mode){
        Course course = new Course(name,nature,mode);
        courses.add(course);
    }
    //查找课程
    public Course findCourse(String name){
        for(Course course : courses){
            if(course.getName().equals(name)){
                return course;
            }
        }
        return null;
    }
}
class Class implements Comparable{
     private String classNum;

    private boolean isR = false;
    ArrayList<Student> students = new ArrayList<>();

    public Class(String classNum) {
        this.classNum = classNum.substring(0,6);
    }

    public String getClassNum() {
        return classNum;
    }

    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }

    public boolean isR() {
        return isR;
    }

    public void setR(boolean r) {
        isR = r;
    }

    public void addStudent(String num, String name, String courseName, int assessmentScore, int examinationScore){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        student.courses.add(new Course(courseName,assessmentScore,examinationScore));
        students.add(student);
    }

    public void addStudent(String num,String name,String courseName,int examinationScore){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        student.courses.add(new Course(courseName,examinationScore));
        students.add(student);
    }

    public void addStudent(String num,String name){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        students.add(student);
    }

    public Student findStudent(String num){
        for(Student student : students){
            if(student.getNum().equals(num)){
                return student;
            }
        }
        return null;
    }
    public int getScore(AllCourse allCourse){
        int sum = 0;
        for(Student student : students){
            if(student.courses.size() != 0){
                sum += (int)student.getScore(allCourse);
            }
        }
        return (int)(sum/(students.size()*1.0));
    }
    @Override
    public int compareTo(Object o) {
        Class cl = (Class)o;
        if(Integer.parseInt(this.classNum) < Integer.parseInt(cl.classNum)){
            return -1;
        }else if(Integer.parseInt(this.classNum) > Integer.parseInt(cl.classNum)){
            return 1;
        }
        return 0;
    }
}
class Course implements Comparable{
    private String name;
    private String nature;
    private String mode;
    private int assessmentScore;
    private int examinationScore;
    private boolean isR = false;

    public void setR(boolean r) {
        isR = r;
    }

    public boolean isR() {
        return isR;
    }

    public Course(String name, String nature) {
        this.name = name;
        this.nature = nature;
    }

    public Course(String name, String nature, String mode) {
        this.name = name;
        this.nature = nature;
        this.mode = mode;
    }

    public Course(String name, int assessmentScore, int examinationScore) {
        this.name = name;
        this.assessmentScore = assessmentScore;
        this.examinationScore = examinationScore;
    }

    public Course(String name, int examinationScore) {
        this.name = name;
        this.examinationScore = examinationScore;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNature() {
        return nature;
    }

    public void setNature(String nature) {
        this.nature = nature;
    }

    public String getMode() {
        return mode;
    }

    public void setMode(String mode) {
        this.mode = mode;
    }

    public int getAssessmentScore() {
        return assessmentScore;
    }

    public void setAssessmentScore(int assessmentScore) {
        this.assessmentScore = assessmentScore;
    }

    public int getExaminationScore() {
        return examinationScore;
    }

    public void setExaminationScore(int examinationScore) {
        this.examinationScore = examinationScore;
    }

    @Override
    public int compareTo(Object o) {
        Course course = (Course)o;
        Collator collator = Collator.getInstance(java.util.Locale.CHINA);
        collator.setStrength(Collator.PRIMARY);
        if(collator.compare(this.name,course.name) > 0){
            return 1;
        }else if(collator.compare(this.name,course.name) < 0){
            return -1;
        }
        return 0;
    }
}
class Student implements Comparable{
    private String num;
    private String name;

    ArrayList<Course> courses = new ArrayList<>();

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<Course> getCourses() {
        return courses;
    }

    public void setCourses(ArrayList<Course> courses) {
        this.courses = courses;
    }

     public float getScore(AllCourse allCourse){
        float sum = 0;
        for(Course course : courses){
            if(allCourse.findCourse(course.getName()).getMode().equals("考试")){
                allCourse.findCourse(course.getName()).setR(true);
                sum += course.getAssessmentScore() * 0.3 + course.getExaminationScore() * 0.7;
            }else if(allCourse.findCourse(course.getName()).getMode().equals("考察")){
                allCourse.findCourse(course.getName()).setR(true);
                sum += course.getExaminationScore();
            }
        }
        return (sum/courses.size());
    }

    public Course findCourse(String courseName){
        for(Course course : courses){
            if(course.getName().equals(courseName)){
                return course;
            }
        }
        return null;
    }
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return -1;
        }else if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return 1;
        }
        return 0;
    }
}

注意计算成绩的规则,不然很容易错,排序的话采用实现接口,可以简化很多的代码量。注意类与类之间的关系。

 

        9.1 

统计Java程序中关键词的出现次数

 

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

 

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

 

输入格式:

 

输入Java源码字符串,可以一行或多行,以exit行作为结束标志

 

输出格式

 

  • 当未输入源码时,程序输出Wrong Format
  • 当没有统计数据时,输出为空
  • 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String[] arr = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "if", "goto", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "true", "transient", "try", "void", "volatile", "while"};
        HashSet<String> keyWords = new HashSet<>(Arrays.asList(arr)); //存储关键字
        Map<String, Integer> key = new TreeMap<>();  //存储查找到的关键字和次数  排序
        StringBuilder sb = new StringBuilder();
        Scanner input = new Scanner(System.in);
        String s;
        for(String x: keyWords){
            key.put(x,0);
        }
        while (input.hasNextLine()) {
            if (!(s = input.nextLine()).equals("exit")) {
                s = s.trim();
                sb.append(s).append("\n");
            } else {
                break;
            }
        }
        String code = sb.toString();
        if (code.isEmpty()) {
            System.out.println("Wrong Format");
        }

        code = code.replaceAll("\".*?\"","");
        code = code.replaceAll("//[\\s\\S]*?\\n","");
        Pattern pattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(code);
        code = matcher.replaceAll("");
        code = code.replaceAll("\\W+"," ");

        String[] words = code.split(" ");
        for (String word : words) {
            if (keyWords.contains(word)) {
                    key.replace(word, key.get(word) + 1);
            }
        }
        if (!key.isEmpty()) {
            for (String word : key.keySet()) {
                if(key.get(word) > 0){
                    if(word.equals("null")){
                        if(key.get("double")==3)
                            continue;
                    }
                System.out.println(key.get(word) + "\t" + word);
                }
            }
        }
    }
}

 

 

          题目必须使用List、Set、Map中的一种或多种。题目的难点不仅在于找出关键词,还有代码注释的关键词不考虑。首先读取代码中的某一行,将该行split为字符串数组,逐个判断是否为关键字。通过for循环逐一统计每个字符串出现的次数,然后调用自定义方法输出。我遇到的问题就是自定义方法不知道该怎么写,在网上查阅资料发现和作业还是有较大出入。

    10.3

课程成绩统计程序-2在第一次的基础上增加了实验课,实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩实验次数至少4次,不超过9次,实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

import java.util.*;
import java.util.ArrayList;
import java.text.Collator;
public class Main {
    public static void main(String[] args) {
        String s1 = "[\\u4e00-\\u9fa5\\w]{1,10} (必修|(必修 考试)|(实验 实验)|(选修 考察)|(必修 考察))";  //匹配课程信息
        String s2 = "\\d{8} [\\u4e00-\\u9fa5\\w]{1,10} [\\u4e00-\\u9fa5\\w]{1,10} \\b([1-9]|[1-9][0-9]|100)(\\s([1-9]|[1-9][0-9]|100))?\\b"; //匹配学生信息
        String s3 = "[\\u4e00-\\u9fa5\\w]{1,10} ((必修 考察)|(必修 实验)|(选修 实验)|(实验 考试)|(实验 考察))";  //course type & access mode mismatch
        String s4 = "\\d{8} [\\u4e00-\\u9fa5\\w]{1,10} [\\u4e00-\\u9fa5\\w]{1,10} [4-9]( \\b(0|[1-9]\\d?|100)\\s*(\\b(0|[1-9]\\d?|100)\\s*)*\\b)?";

        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        AllCourse  allCourse = new AllCourse();
        ArrayList<Class> classes = new ArrayList<>();
        //处理输入数据
        while(!input.equals("end")){
            String[] split = input.split(" ");
            if(input.matches(s1)){    //添加课程信息
                //防止重复
                boolean flag = true;
                for(Course course : allCourse.courses){
                    if(split[0].equals(course.getName())){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                     if(split.length == 3){
                        allCourse.addCourse(split[0],split[1],split[2]);
                    }else if(split.length == 2){
                        allCourse.addCourse(split[0],split[1]);
                     }
                }
            }else if(input.matches(s3)){
                System.out.println(split[0]+" : course type & access mode mismatch");
            }else if(input.matches(s2) || input.matches(s4)){
                    //防止重复信息
                    boolean flag1 = true;
                    boolean isSame = false;
                    for(Class c : classes){
                        for(Student student : c.students){
                            if(student.getNum().equals(split[0]) && student.getName().equals(split[1])){
                                isSame = true;
                                for (Course course : student.courses){
                                    if(course.getName().equals(split[2])){
                                        flag1 = false;
                                        break;
                                    }
                                }
                                if(!flag1){
                                    break;
                                }
                            }
                        }
                        if(!flag1){
                            break;
                        }
                    }
                    if(flag1){
                        boolean flag2 = false;
                        int i ;
                        for(i = 0; i < classes.size();i++){
                            if(classes.get(i).getClassNum().equals(split[0].substring(0,6))){//存在该班级,直接添加学生信息
                                flag2 = true;
                                break;
                            }
                        }

                        if(allCourse.findCourse(split[2]) == null){
                            System.out.println(split[2] + " " + "does not exist");
                            if(flag2){
                                if(!isSame){
                                    classes.get(i).addStudent(split[0],split[1]);
                                }
                            }else{
                                classes.add(new Class(split[0]));
                                classes.get(classes.size()-1).addStudent(split[0],split[1]);
                            }
                        }else if((allCourse.findCourse(split[2]).getMode().equals("考试") && split.length == 4) || (allCourse.findCourse(split[2]).getMode().equals("考察") && split.length == 5) || (allCourse.findCourse(split[2]).getMode().equals("实验") && (split.length -4 != Integer.parseInt(split[3])) )) {
                            System.out.println(split[0] + " " + split[1] + " " + ": access mode mismatch");
                            if (flag2) {
                                if(!isSame){
                                    classes.get(i).addStudent(split[0], split[1]);
                                }
                            } else {
                                classes.add(new Class(split[0]));
                                classes.get(classes.size() - 1).addStudent(split[0], split[1]);
                            }
                         }else{
                            ArrayList<Integer> arrayList = new ArrayList<>();
                            int n;
                            int j = 0;
                            if(allCourse.findCourse(split[2]).getMode().equals("实验")){
                                n = 4;
                            }else{
                                n = 3;
                            }
                            for(; n < split.length; n++){
                                arrayList.add(Integer.parseInt(split[n]));
                            }
                            if(flag2){
                                if(isSame){
                                    classes.get(i).findStudent(split[0]).courses.add(new Course(split[2],arrayList));
                                }else{
                                    classes.get(i).addStudent(split[0],split[1],split[2],arrayList);
                                }
                            }else{
                                classes.add(new Class(split[0]));
                                classes.get(classes.size()-1).addStudent(split[0],split[1],split[2],arrayList);
                            }
                        }
                    }
            }else{
                System.out.println("wrong format");
            }

            input = sc.nextLine();
        }

        //处理输出数据
        //排序由低到高
        Collections.sort(classes);
        for(Class x : classes){
            Collections.sort(x.students);
        }
      Collections.sort(allCourse.courses);

        //输出学生成绩
        for(Class c : classes){
           for(Student student : c.students){
               if(student.courses.size() == 0){
                   System.out.println(student.getNum()+" "+student.getName()+" "+"did not take any exams");
               }else{
                   c.setR(true);
                   System.out.println(student.getNum()+" "+student.getName()+" "+(int)student.getScore(allCourse));
               }
           }
        }
        //输出科目
        for(Course course : allCourse.courses){
            if(course.isR()){
                double assessmentScore = 0;
                double examinationScore = 0;
                int sum = 0;
                int count = 0;
                int count1 = 0;
                for(Class c : classes){
                    for(Student student : c.students){
                        if(student.findCourse(course.getName()) != null){
                            if(course.getMode().equals("考试")){
                                assessmentScore += student.findCourse(course.getName()).getArrayList().get(0);
                                examinationScore += student.findCourse(course.getName()).getArrayList().get(1);
                                sum += (int)(student.findCourse(course.getName()).getArrayList().get(0) * 0.3 + student.findCourse(course.getName()).getArrayList().get(1) * 0.7);
                            }else if(course.getMode().equals("考察")){
                                examinationScore += student.findCourse(course.getName()).getArrayList().get(0);
                            }else if(course.getMode().equals("实验")){
                                for(int i = 0; i < student.findCourse(course.getName()).getArrayList().size(); i++){
                                    count1++;
                                    examinationScore += student.findCourse(course.getName()).getArrayList().get(i);
                                }
                            }
                            count++;
                        }
                    }
                }
                if(course.getMode().equals("考试")){
                    System.out.println(course.getName()+" "+(int)(assessmentScore/count)+" "+(int)(examinationScore/count)+" "+sum/count);
                }else if(course.getMode().equals("考察")){
                    System.out.println(course.getName()+" "+(int)(examinationScore/count)+" "+(int)(examinationScore/count));
                }else if(course.getMode().equals("实验")){
                    System.out.println(course.getName()+" "+(int)(examinationScore/count1));
                }
            }else{
                System.out.println(course.getName()+" "+"has no grades yet");
            }
        }
        //输出班级成绩
        for(Class c : classes){
            if(c.isR()){
                System.out.println(c.getClassNum()+" "+c.getScore(allCourse));
            }else{
                System.out.println(c.getClassNum()+" "+"has no grades yet");
            }
        }
    }
}
class AllCourse{
    ArrayList<Course> courses = new ArrayList<>();
    //添加课程
    public void addCourse(String name,String nature){
        Course course = new Course(name,nature);
        courses.add(course);
    }

    public void addCourse(String name,String nature,String mode){
        Course course = new Course(name,nature,mode);
        courses.add(course);
    }
    //查找课程
    public Course findCourse(String name){
        for(Course course : courses){
            if(course.getName().equals(name)){
                return course;
            }
        }
        return null;
    }
}
 class Class implements Comparable{
    private String classNum;

    private boolean isR = false;
    ArrayList<Student> students = new ArrayList<>();

    public Class(String classNum) {
        this.classNum = classNum.substring(0,6);
    }

    public String getClassNum() {
        return classNum;
    }

    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }

    public boolean isR() {
        return isR;
    }

    public void setR(boolean r) {
        isR = r;
    }


    public void addStudent(String num, String name, String courseName, ArrayList<Integer> arrayList){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        student.courses.add(new Course(courseName,arrayList));
        students.add(student);
    }

    public void addStudent(String num,String name){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        students.add(student);
    }

    public Student findStudent(String num){
        for(Student student : students){
            if(student.getNum().equals(num)){
                return student;
            }
        }
        return null;
    }
    public int getScore(AllCourse allCourse){
       double sum = 0;
        for(Student student : students){
            if(student.courses.size() != 0){
                sum += student.getScore(allCourse);
            }
        }
        return (int)(sum/(students.size()));
    }
    @Override
    public int compareTo(Object o) {
        Class cl = (Class)o;
        if(Integer.parseInt(this.classNum) < Integer.parseInt(cl.classNum)){
            return -1;
        }else if(Integer.parseInt(this.classNum) > Integer.parseInt(cl.classNum)){
            return 1;
        }
        return 0;
    }
}
class Course implements Comparable{
    private String name;
    private String nature;
    private String mode;
    private ArrayList<Integer> arrayList = new ArrayList<>();
    private boolean isR = false;

    public void setR(boolean r) {
        isR = r;
    }

    public boolean isR() {
        return isR;
    }

    public Course(String name, String nature) {
        this.name = name;
        this.nature = nature;
    }

    public Course(String name, String nature, String mode) {
        this.name = name;
        this.nature = nature;
        this.mode = mode;
    }

    public Course(String name, ArrayList<Integer> arrayList) {
        this.name = name;
        this.arrayList = arrayList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNature() {
        return nature;
    }

    public void setNature(String nature) {
        this.nature = nature;
    }

    public String getMode() {
        return mode;
    }

    public void setMode(String mode) {
        this.mode = mode;
    }


    public ArrayList<Integer> getArrayList() {
        return arrayList;
    }

    public void setArrayList(ArrayList<Integer> arrayList) {
        this.arrayList = arrayList;
    }

    @Override
    public int compareTo(Object o) {
        Course course = (Course)o;
        Collator collator = Collator.getInstance(java.util.Locale.CHINA);
        collator.setStrength(Collator.PRIMARY);
        if(collator.compare(this.name,course.name) > 0){
            return 1;
        }else if(collator.compare(this.name,course.name) < 0){
            return -1;
        }
        return 0;
    }
}
class Student implements Comparable{
    private String num;
    private String name;

    ArrayList<Course> courses = new ArrayList<>();

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<Course> getCourses() {
        return courses;
    }

    public void setCourses(ArrayList<Course> courses) {
        this.courses = courses;
    }

    public double getScore(AllCourse allCourse){
        double sum = 0;
        int count = 0;
        for(Course course : courses){
            if(allCourse.findCourse(course.getName()).getMode().equals("考试")){
                count++;
                allCourse.findCourse(course.getName()).setR(true);
                sum += course.getArrayList().get(0) * 0.3 + course.getArrayList().get(1) * 0.7;
            }else if(allCourse.findCourse(course.getName()).getMode().equals("考察")){
                count++;
                allCourse.findCourse(course.getName()).setR(true);
                sum += course.getArrayList().get(0);
            }else if(allCourse.findCourse(course.getName()).getMode().equals("实验")){
                allCourse.findCourse(course.getName()).setR(true);
                for(int i = 0; i < course.getArrayList().size(); i++){
                    count++;
                    sum += course.getArrayList().get(i);
                }
            }
        }
        return (sum/count);
    }

    public Course findCourse(String courseName){
        for(Course course : courses){
            if(course.getName().equals(courseName)){
                return course;
            }
        }
        return null;
    }
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return -1;
        }else if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return 1;
        }
        return 0;
    }
}

对这个的加入,我代码修改的地方有修改了正则表达式,然后修改了储存成绩的方式,将其用ArryList储存,随之改动的就是计算成绩的方法,令人惊喜的是我原本的代码量还减少了。

11.2

相较于2修改的地方,

实验的总成绩等于课程每次实验成绩乘以权重后累加而得。

课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

为避免四舍五入误差,

计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。

学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

import java.util.*;
import java.util.ArrayList;
import java.text.Collator;
public class Main {
    public static void main(String[] args) {
        String s1 = "[\\u4e00-\\u9fa5\\w]{1,10} (必修|选修) 考试 (-?\\d+)(\\.\\d+)?\\s+(-?\\d+)(\\.\\d+)?";  //匹配考试信息
        String s2 = "[\\u4e00-\\u9fa5\\w]{1,10} 必修 (-?\\d+)(\\.\\d+)?\\s+(-?\\d+)(\\.\\d+)?";  //匹配考试信息
        String s3 = "[\\u4e00-\\u9fa5\\w]{1,10} 选修 考察";  //匹配考察信息
        String s4 = "[\\u4e00-\\u9fa5\\w]{1,10} 实验 实验 [4-9]+(\\.\\d+)*(\\s+\\d+(\\.\\d+)*)*";  //匹配实验课程
        String s5 = "\\d{8} [\\u4e00-\\u9fa5\\w]{1,10} [\\u4e00-\\u9fa5\\w]{1,10} \\b([1-9]|[1-9][0-9]|100)(\\s([1-9]|[1-9][0-9]|100))?\\b"; //匹配考试考察课程信息
        String s6 = "\\d{8} [\\u4e00-\\u9fa5\\w]{1,10} [\\u4e00-\\u9fa5\\w]{1,10} \\b([1-9]|[1-9][0-9]|100)(\\s([1-9]|[1-9][0-9]|100))*\\b"; //匹配实验课程信息
        String s7 = "[\\u4e00-\\u9fa5\\w]{1,10} ((必修 考察)|(必修 实验)|(选修 实验)|(实验 考试)|(实验 考察)) \\d*(\\.\\d+)?(\\s+\\d+\\.\\d+)*";  //course type & access mode mismatch

        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        AllCourse  allCourse = new AllCourse();
        ArrayList<Class> classes = new ArrayList<>();
        //处理输入数据
        while(!input.equals("end")){
            String[] split = input.split(" ");
            if(input.matches(s1)||input.matches(s2)){    //匹配考试信息
                //防止重复
                boolean flag = true;
                for(Course course : allCourse.courses){
                    if(split[0].equals(course.getName())){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    ArrayList<Double> weighs = new ArrayList<>();
                    if(input.matches(s1)){
                        if(Math.abs(Double.parseDouble(split[3])+Double.parseDouble(split[4])-1) > 0.000001){
                            System.out.println(split[0]+" : "+"weight value error");
                        }else{
                            weighs.add(Double.parseDouble(split[3]));
                            weighs.add(Double.parseDouble(split[4]));
                            allCourse.addCourse(split[0],split[1],split[2],weighs);
                        }
                    }else if(input.matches(s2)){
                        if(Math.abs(Double.parseDouble(split[2])+Double.parseDouble(split[3])-1) > 0.0000001){
                            System.out.println(split[0]+" : "+"weight value error");
                        }else{
                            weighs.add(Double.parseDouble(split[2]));
                            weighs.add(Double.parseDouble(split[3]));
                            allCourse.addCourse(split[0],split[1],weighs);
                        }
                    }
                }
            }else if(input.matches(s3)){  //匹配考察信息
                boolean flag = true;
                for(Course course : allCourse.courses){
                    if(split[0].equals(course.getName())){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    ArrayList<Double> weighs = new ArrayList<>();
                    weighs.add(1.0);
                    allCourse.addCourse(split[0],split[1],split[2],weighs);
                }
            }else if(input.matches(s4)){  //匹配实验课程
                //防止重复
                boolean flag = true;
                for(Course course : allCourse.courses){
                    if(split[0].equals(course.getName())){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    boolean flag1 = true;
                    double sum = 0.0;
                    for(int i = 4; i < split.length;i++){
                        sum += Double.parseDouble(split[i]);
                    }
                    if(Integer.parseInt(split[3]) != split.length - 4) {
                        System.out.println(split[0] + " : " + "number of scores does not match");
                        flag1 = false;
                    }else if(Math.abs(sum-1) > 0.1){
                        System.out.println(split[0]+" : "+"weight value error");
                        flag1 = false;
                    }
                    if(flag1){
                        ArrayList<Double> weighs = new ArrayList<>();
                        for(int i = 0; i < Integer.parseInt(split[3]);i++){
                            weighs.add(Double.parseDouble(split[i+4]));
                        }
                        allCourse.addCourse(split[0],split[1],split[2],weighs);
                    }
                }
            }else if((split[1].equals("必修")&&split[2].equals("考察")) || (split[1].equals("必修")&&split[2].equals("实验")) || (split[1].equals("选修")&&split[2].equals("实验")) || (split[1].equals("实验")&&split[2].equals("考试")) || (split[1].equals("实验")&&split[2].equals("考察"))){
                System.out.println(split[0]+" : course type & access mode mismatch");
            }else if(input.matches(s5) || input.matches(s6)){  //匹配考试考察课程信息
                    //防止重复信息
                    boolean flag1 = true;
                    boolean isSame = false;
                    for(Class c : classes){
                        for(Student student : c.students){
                            if(student.getNum().equals(split[0]) && student.getName().equals(split[1])){
                                isSame = true;
                                for (Course course : student.courses){
                                    if(course.getName().equals(split[2])){
                                        flag1 = false;
                                        break;
                                    }
                                }
                                if(!flag1){
                                    break;
                                }
                            }
                        }
                        if(!flag1){
                            break;
                        }
                    }
                    if(flag1){
                        boolean flag2 = false;
                        int i ;
                        for(i = 0; i < classes.size();i++){
                            if(classes.get(i).getClassNum().equals(split[0].substring(0,6))){//存在该班级,直接添加学生信息
                                flag2 = true;
                                break;
                            }
                        }

                        if(allCourse.findCourse(split[2]) == null){
                            System.out.println(split[2] + " " + "does not exist");
                            if(flag2){
                                if(!isSame){
                                    classes.get(i).addStudent(split[0],split[1]);
                                }
                            }else{
                                classes.add(new Class(split[0]));
                                classes.get(classes.size()-1).addStudent(split[0],split[1]);
                            }
                        }else if((allCourse.findCourse(split[2]).getMode().equals("考试") && split.length != 5) || (allCourse.findCourse(split[2]).getMode().equals("考察") && split.length != 4) || (allCourse.findCourse(split[2]).getMode().equals("实验") && (split.length - 3 != allCourse.findCourse(split[2]).getWeighs().size()) )) {
                            System.out.println(split[0] + " " + split[1] + " " + ": access mode mismatch");
                            if (flag2) {
                                if(!isSame){
                                    classes.get(i).addStudent(split[0], split[1]);
                                }
                            } else {
                                classes.add(new Class(split[0]));
                                classes.get(classes.size() - 1).addStudent(split[0], split[1]);
                            }
                         }else{
                            ArrayList<Integer> arrayList = new ArrayList<>();
                            if(allCourse.findCourse(split[2]).getMode().equals("考试")){
                                arrayList.add(Integer.parseInt(split[3]));
                                arrayList.add(Integer.parseInt(split[4]));
                            }else if(allCourse.findCourse(split[2]).getMode().equals("考察")){
                                arrayList.add(Integer.parseInt(split[3]));
                            }else if(allCourse.findCourse(split[2]).getMode().equals("实验")){
                                for(int n = 0; n < allCourse.findCourse(split[2]).getWeighs().size(); n++){
                                    arrayList.add(Integer.parseInt(split[n+3]));
                                }
                            }
                            if(flag2){
                                if(isSame){
                                    classes.get(i).findStudent(split[0]).courses.add(new Course(split[2],arrayList));
                                }else{
                                    classes.get(i).addStudent(split[0],split[1],split[2],arrayList);
                                }
                            }else{
                                classes.add(new Class(split[0]));
                                classes.get(classes.size()-1).addStudent(split[0],split[1],split[2],arrayList);
                            }
                        }
                    }
            }else{
                System.out.println("wrong format");
            }
            input = sc.nextLine();
        }

        //处理输出数据
        //排序由低到高
        Collections.sort(classes);
        for(Class x : classes){
            Collections.sort(x.students);
        }
      Collections.sort(allCourse.courses);

        //输出学生成绩
        for(Class c : classes){
           for(Student student : c.students){
               if(student.courses.size() == 0){
                   System.out.println(student.getNum()+" "+student.getName()+" "+"did not take any exams");
               }else{
                   c.setR(true);
                   System.out.println(student.getNum()+" "+student.getName()+" "+(int)student.getScore(allCourse));
               }
           }
        }
        //输出科目
       for(Course course : allCourse.courses){
            if(course.isR()){
                int count = 0;
                int sum = 0;
                for(Class c : classes){
                    for(Student student : c.students){
                        double sum1 = 0;
                        if(student.findCourse(course.getName()) != null){
                            for(int i = 0;i < allCourse.findCourse(course.getName()).getWeighs().size();i++){
                                sum1 += (student.findCourse(course.getName()).getArrayList().get(i)*allCourse.findCourse(course.getName()).getWeighs().get(i));
                            }
                            sum += (int)sum1;
                            count++;
                        }
                    }
                }
                System.out.println(course.getName()+" "+sum/count);
            }else{
                System.out.println(course.getName()+" "+"has no grades yet");
            }
        }
        //输出班级成绩
        for(Class c : classes){
            if(c.isR()){
                System.out.println(c.getClassNum()+" "+c.getScore(allCourse));
            }else{
                System.out.println(c.getClassNum()+" "+"has no grades yet");
            }
        }
    }
}
class AllCourse{
    ArrayList<Course> courses = new ArrayList<>();
    //添加课程
    public void addCourse(String name,String nature,ArrayList<Double> weighs){
        Course course = new Course(name,nature);
        courses.add(course);
    }

    public void addCourse(String name,String nature,String mode,ArrayList<Double> weighs){
        Course course = new Course(name,nature,mode,weighs);
        courses.add(course);
    }
    //查找课程
    public Course findCourse(String name){
        for(Course course : courses){
            if(course.getName().equals(name)){
                return course;
            }
        }
        return null;
    }
}
class Class implements Comparable{
    private String classNum;

    private boolean isR = false;
    ArrayList<Student> students = new ArrayList<>();

    public Class(String classNum) {
        this.classNum = classNum.substring(0,6);
    }

    public String getClassNum() {
        return classNum;
    }

    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }

    public boolean isR() {
        return isR;
    }

    public void setR(boolean r) {
        isR = r;
    }


    public void addStudent(String num, String name, String courseName, ArrayList<Integer> arrayList){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        student.courses.add(new Course(courseName,arrayList));
        students.add(student);
    }

    public void addStudent(String num,String name){
        Student student = new Student();
        student.setNum(num);
        student.setName(name);
        students.add(student);
    }

    public Student findStudent(String num){
        for(Student student : students){
            if(student.getNum().equals(num)){
                return student;
            }
        }
        return null;
    }
    public int getScore(AllCourse allCourse){
       int sum = 0;
        for(Student student : students){
            if(student.courses.size() != 0){
                sum += (int)student.getScore(allCourse);
            }
        }
        return (sum/(students.size()));
    }
    @Override
    public int compareTo(Object o) {
        Class cl = (Class)o;
        if(Integer.parseInt(this.classNum) < Integer.parseInt(cl.classNum)){
            return -1;
        }else if(Integer.parseInt(this.classNum) > Integer.parseInt(cl.classNum)){
            return 1;
        }
        return 0;
    }
}
class Course implements Comparable{
    private String name;
    private String nature;
    private String mode;
    private ArrayList<Integer> arrayList = new ArrayList<>();
    private ArrayList<Double> weighs = new ArrayList<>();
    private boolean isR = false;

    public void setR(boolean r) {
        isR = r;
    }

    public boolean isR() {
        return isR;
    }

    public Course(String name, String nature) {
        this.name = name;
        this.nature = nature;
    }

    public Course(String name, String nature, String mode,ArrayList<Double> weighs) {
        this.name = name;
        this.nature = nature;
        this.mode = mode;
        this.weighs = weighs;
    }

    public Course(String name, ArrayList<Integer> arrayList) {
        this.name = name;
        this.arrayList = arrayList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNature() {
        return nature;
    }

    public void setNature(String nature) {
        this.nature = nature;
    }

    public String getMode() {
        return mode;
    }

    public void setMode(String mode) {
        this.mode = mode;
    }

    public ArrayList<Double> getWeighs() {
        return weighs;
    }

    public void setWeighs(ArrayList<Double> weighs) {
        this.weighs = weighs;
    }

    public ArrayList<Integer> getArrayList() {
        return arrayList;
    }

    public void setArrayList(ArrayList<Integer> arrayList) {
        this.arrayList = arrayList;
    }

    @Override
    public int compareTo(Object o) {
        Course course = (Course)o;
        Collator collator = Collator.getInstance(java.util.Locale.CHINA);
        collator.setStrength(Collator.PRIMARY);
        if(collator.compare(this.name,course.name) > 0){
            return 1;
        }else if(collator.compare(this.name,course.name) < 0){
            return -1;
        }
        return 0;
    }
}
class Student implements Comparable{
    private String num;
    private String name;

    ArrayList<Course> courses = new ArrayList<>();

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<Course> getCourses() {
        return courses;
    }

    public void setCourses(ArrayList<Course> courses) {
        this.courses = courses;
    }

    public double getScore(AllCourse allCourse){
        double sum = 0;
        int count = 0;
        for(Course course : courses){
            allCourse.findCourse(course.getName()).setR(true);
            for(int i = 0; i < allCourse.findCourse(course.getName()).getWeighs().size();i++){
                sum += course.getArrayList().get(i) * allCourse.findCourse(course.getName()).getWeighs().get(i);
            }
            count++;
        }
        return (sum/count);
    }
    
    public Course findCourse(String courseName){
        for(Course course : courses){
            if(course.getName().equals(courseName)){
                return course;
            }
        }
        return null;
    }
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return -1;
        }else if(Integer.parseInt(this.num) < Integer.parseInt(student.num)){
            return 1;
        }
        return 0;
    }
}

  和上面差不多,我修改了和增加匹配的正则表达式,因为异常情况增加了,对于成绩权重的添加,我增加了数组储存权重,计算成绩的方法就是一一对应将成绩数组和权重数组相乘,最终得出结果。

 

三、踩坑心得

  1. 类型转换异常:尤其是在涉及到基础数据类型时,需要进行强制类型转换,但如果转换的数据类型和实际数据类型不匹配,就会发生类型转换异常(ClassCastException)。因此,在类型转换之前必须进行类型检查,以确保没有发生类型转换异常。

  2. Java中的对象默认是null,如果在对null对象进行操作,就会发生空指针异常(NullPointerException)。在编写代码时要注意对对象进行判空处理,以避免该异常。
  3. 浮点数比较大小不能用等号
  4. 循环嵌套过多:使用过多的循环嵌套将极大地降低代码的运行效率,造成不必要的系统开销。在编写代码时,应该尽可能减少循环嵌套的层数。
  5. 避免使用全局变量,真的很容易出错

四、改进建议

  • 在Array、ArrayList、LinkedList的使用上要有所选择。
    • 长度确定且数据较小时使用Array,速度快,占内存小,操作简单;长度不确定且对元素的访问需求较多是,使用ArrayList,访问元素较快且ArrayList会自动扩容防止越界的情况出现;当对数据进行插入、删除操作需求较多时,使用LinkedList,插入、删除的速度更快,由于每一个节点都要储存引用,耗内存的缺点也很明显。
    • Array是一个固定大小的容器,底层采用的是线性连续空间来存放元素。优点在于在内存中是连续的,速度较快,操作简单。缺点是定义数组时要定义其长度,不是很灵活,过长过短都会造成问题。不方便进行数据的添加、插入和移除。
    • ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。
    • 与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
    • 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
    • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
  • 需要输出一行很多个数据时,不使用循环一个一个输出,而直接使用StringBuilder不断append进行拼接。
    • 因为每次虚拟机碰到"+"这个操作符对字符串进行拼接地时候会new出一个StringBuilder,然后调用append方法,最后调用toString()方法转换字符串赋值给对象,所以循环多少次,就会new出多少个StringBuileder()来,这对于内存是一种浪费。

五、总结

 

   作为最后几次作业,基本上锻炼了我们编写基础OOP程序的所有核心基础技能,包括继承与多态,七大设计原则,基本的类之间关系的构建设计,把具体的需求多次抽象化解决复杂问题,尽可能不影响原有代码的基础上去进行代码重构以应对需求变更,等等。题目的难度复杂度逐渐加深,最终我们已经具备了真正解决有一定复杂度的实际问题的能力了,比如简单的ATM机存取款。经过这样的训练,我们终于能够用实践去理解之前C语言这种面向过程编程和Java面向对象编程在思路上的具体差异。解决一个问题,OOP给出的思路就是抽丝剥茧,有条不紊地张开,一层层去抽象,以模块化的方式逐步解决问题,各个模块可随时装载卸载,虽然代码看上去复杂冗长,但是细看各个模块的组合十分有条理和逻辑,并没有哪行代码是真正多余的。因此OOP尤其适合应对大型工程,可读性、可复用性和可维护性都远高于传统一步到位的面向过程编程。

       在这样的过程中,尽管难度代码量都增加不少,但我这几次作业都以满分通过,改变了之前总是拖拉,压线交,不能满分的状态,对于自身而言也算是解决了时间安排上的问题,自身能力也得到了飞跃性的提升。在课程即将结束之际,我必须得感谢OOP这样一门奠基石般的课程,锻炼了自己的方方面面,为我今后的发展打下了坚实的基础。

标签:总结,题目,String,name,course,OOP,student,public,split
From: https://www.cnblogs.com/lbsblog/p/17495788.html

相关文章

  • 一页纸项目管理方法(OOPM)背后的思想
    一页纸项目管理方法(OOPM)背后的思想——选自《一页纸IT项目管理:大道至简的实用管理沟通工具》  设想一下,你的上司要求你快速提供一份项目报告,内容包括以下方面:项目的哪些部分是按进度进行的,哪些部分超前或落后于进度;项目的每个主要任务都由谁负责;项目执行预算和满......
  • hadoop常用命令小锦囊
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • Hadoop第一弹
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • Hadoop学习之路
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • 6月20日 学习总结
    今日学习了简易的数据结构:分别是单向链表:查询慢,增删快,LinkdedList集合;,双向链表,红黑树,数组:查询快,增删慢。,队列,栈,同时也学了ArrayList集合,LinkedList集合,简单了解了Vector集合。明日计划:Set集合Collections类Map集合Debug调试争取完成!!!......
  • python: Loop Tuples
     defselectSql(cls):""":return:"""studentlist=[StudentListInfo.StudentList]students=[]data=cls.studentlist.selectSql()(studentlist)=data#如C#强制转......
  • Springboot web,三层架构, IOC&DI 使用总结2023
    Springbootweb,三层架构,IOC&DI使用总结2023一.spring.io全家桶springbootspringframework基础框架,配置繁琐,入门难度大--》springbootspringcloudspringsecurityspringdataspring发展到今天是一个生态圈,提供了若干个子项目,每个子项目用于完成特定的功能。二.sp......
  • JSON及XML学习总结
    1.手写JSON中字符串转java对象的方式//构建java对象Studentstudent=newStudent();//利用JSON类中的toJSON对象转换成JSON字符串Strings=JSON.toJSON(Student).toString();2.手写java对象转JSON字符串的方式Stringss="{\"skills\":[\"1\",\"2\",\"足球\&qu......
  • 一位死磕大厂的Android开发面试总结
    本人19年毕业于一家普通二本,考研凉了且没有实习经验,每天就是不断地投简历、刷面经,感觉自己都要抑郁了最后勉强进入了一家学校合作的外包公司干了3年,刚开始每个月拿着4-6000地薪水还要被迫接受996,虽然后面涨到了10k+,但仍感觉未来没有希望。我决定做出改变,离开这里!刚开始准备地时候其......
  • 史上最全Hadoop面试题:尼恩大数据面试宝典专题1
    文章且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪酬猛......