题目集6-8总结
前言:题目集6涉及到了java中较为基础和较为复杂的语法知识,包含但不限于输入输出中所要用到的java.util.Scanner包,Scanner input = new Scanner(System.in),System.out.println语句、选择判断中所要用到的if/else,else if,switch语句、循环中所要用到的while,do while,for,foreach语句的语法知识,题量适中,难度较为困难;题目集7涉及到了面向对象编程中与面向过程不同的特殊语法:类与对象中所要用到的为对象定义类,使用构造方法构造对象,通过引用变量引用对象,对象数组等语法知识,对其基本使用能力进行考察,题量适中,难度不易;题目集8基于题目集7进一步深入,虽没有较多新知识点的考察,但更能考察我们对较为复杂的需求的处理方法,题量适中,难度较高。总而言之,难度层层递增,对我们的代码水平要求逐渐提升,让我们的编程思维一步步变得更完善。以下对这三次题目集进行分析:
题目集6:
(1)7-1 课程成绩统计程序-1:
代码如下:
import java.text.Collator; import java.util.*; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); String str=""; studentList students=new studentList(); InputMatching matching=new InputMatching(); Cls cls=new Cls(); courseList course=new courseList(); String str1,str2,str3; while(true){ str=input.nextLine(); if(str.split(" ").length>3)break; if(str.equals("end"))break; if(InputMatching.matchingInput(str) != 1){ System.out.println("wrong format"); continue; } str1=str.split(" ")[0]; if(course.searchCourse(str1))continue; str2=str.split(" ")[1]; str3=str.split(" ")[2]; if(str2.equals("必修")&&str3.equals("考察")){ System.out.println(str.split(" ")[0]+" : course type & access mode mismatch"); continue; } if(course.searchCourse(str1))continue; course.courses.add(course.addCourse(str1,str2,str3)); } String number,name,subject; int UsualGrades=0,FinalGrades=0; boolean flag=false; while(!str.equals("end")){ if(flag)str=input.nextLine(); flag=true; if(str.equals("end"))break; if (InputMatching.matchingInput(str) != 2&&InputMatching.matchingInput(str) != 3) { System.out.println("wrong format");// 字符串符合成绩信息模式 continue; } number=str.split(" ")[0]; String Class = number.substring(0, 6); if (!cls.searchCls(Class)) cls.cls.add(cls.addCls(Class)); name=str.split(" ")[1]; students.stu.add(students.addStudent(number,name)); subject=str.split(" ")[2]; try{ if (course.searchQuality(subject) == 1) { UsualGrades = Integer.parseInt(str.split(" ")[3]); FinalGrades = Integer.parseInt(str.split(" ")[4]); if(UsualGrades>100||UsualGrades<0||FinalGrades>100||FinalGrades<0){ System.out.println("wrong format"); continue; } students.students.add(students.addStudentCompulsory(number, name, subject, UsualGrades, FinalGrades)); } else if (course.searchQuality(subject) == 0) { UsualGrades = Integer.parseInt(str.split(" ")[3]); if(str.split(" ").length>4){System.out.println(number+" "+name+" : access mode mismatch");continue;} if(UsualGrades>100||UsualGrades<0){ System.out.println("wrong format"); continue; } students.students.add(students.addStudentTake(number, name, subject, UsualGrades)); } else if (course.searchQuality(subject) == -1) { System.out.println(subject + " does not exist"); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println(number+" "+name+" : access mode mismatch"); } } chooseCourseList choose=new chooseCourseList(); choose.getAverageGrade(students,course,cls); } } class studentList { ArrayList<student> students = new ArrayList<>(); ArrayList<student> stu = new ArrayList<>(); student addStudentCompulsory(String number, String name, String course, int UsualGrades, int FinalGrades) { student newStudent = new student(); chooseCourseList newChoose = new chooseCourseList(); newStudent.name = name; if(newChoose.searchCourse(course)&&newChoose.chooseCourse.get(newChoose.searchCourseInt(course)).name.equals(name)) return null; Cls newCls = new Cls(); newStudent.number = number; newStudent.course = course; newStudent.grade = (int) (FinalGrades * 0.7 + UsualGrades * 0.3); String Class = number.substring(0, 6); if (!newCls.searchCls(Class)) newCls.cls.add(newCls.addCls(Class)); newChoose.chooseCourse.add(newChoose.addChoose(number, name, course, Class, UsualGrades, FinalGrades, newStudent.grade)); return newStudent; } student addStudentTake(String number, String name, String course, int UsualGrades) { student newStudent = new student(); newStudent.name = name; newStudent.number = number; newStudent.course = course; newStudent.grade = UsualGrades; String Class=number.substring(0,6); chooseCourseList newChoose = new chooseCourseList(); if(newChoose.searchCourse(course)&&newChoose.chooseCourse.get(newChoose.searchCourseInt(course)).name.equals(name)) return null; newChoose.chooseCourse.add(newChoose.addChooseTake(number, name, course, Class, UsualGrades, newStudent.grade)); return newStudent; } student addStudent(String id, String name) { student newStudent = new student(); newStudent.number = id; newStudent.name = name; return newStudent; } boolean searchStudent(String name) { for (int i = 0; i < students.size(); i++) { if (students.get(i).name.equals(name)) return true; } return false; } } class student{ String number; String name; String course; int UsualGrades=0; int FinalGrades=0; String Class; int grade=0; public static Comparator<student> getNumberComparator() { return new Comparator<student>() { @Override public int compare(student s1, student s2) { return s1.number.compareTo(s2.number); } }; } } class course{ String name; String quality; String manner; public static Comparator<course> getChineseNameComparator() { final Collator collator = Collator.getInstance(java.util.Locale.CHINA); // 获取中文排序规则 return new Comparator<course>() { @Override public int compare(course c1, course c2) { return collator.compare(c1.name, c2.name); } }; } } class courseList{ ArrayList<course>courses=new ArrayList<>(); boolean searchCourse(String CourseName){ for(int i=0;i<courses.size();i++) if(courses.get(i).name.equals(CourseName))return true; return false; } course addCourse( String name,String quality,String manner){ course newCourse=new course(); newCourse.name=name; newCourse.quality=quality; newCourse.manner=manner; return newCourse; } int searchQuality(String subject){ for(int i=0;i<courses.size();i++){ if(courses.get(i).name.equals(subject)&&courses.get(i).quality.equals("必修"))return 1; else if(courses.get(i).name.equals(subject)&&courses.get(i).manner.equals("考试"))return 1; else if (courses.get(i).name.equals(subject)) return 0; } return -1; } } class chooseCourseList{ static ArrayList<student> chooseCourse=new ArrayList<>(); static boolean searchId(String id){ for(int i=0;i<chooseCourse.size();i++) if(chooseCourse.get(i).number.equals(id))return true; return false; } static boolean searchCourse(String course){ for(int i=0;i<chooseCourse.size();i++) if(chooseCourse.get(i).course.equals(course))return true; return false; } static int searchCourseInt(String course){ for(int i=0;i<chooseCourse.size();i++) if(chooseCourse.get(i).course.equals(course))return i; return -1; } static boolean searchClass(String Class){ for(int i=0;i<chooseCourse.size();i++) if(chooseCourse.get(i).Class.equals(Class))return true; return false; } student addChoose(String id,String name,String course,String Class,int UsualGrades,int FinalGrades,int grade ) { student newStudent=new student(); newStudent.Class=Class; newStudent.number=id; newStudent.name=name; newStudent.course=course; newStudent.UsualGrades=UsualGrades; newStudent.FinalGrades=FinalGrades; newStudent.grade=grade; return newStudent; } student addChooseTake(String id,String name,String course,String Class,int UsualGrades,int grade ) { student newStudent=new student(); newStudent.Class=Class; newStudent.number=id; newStudent.name=name; newStudent.course=course; newStudent.UsualGrades=UsualGrades; newStudent.grade=grade; return newStudent; } public int getAverageGrades(String id){ int sum=0,cnt=0; for(int i=0;i<chooseCourse.size();i++){ if(chooseCourse.get(i).number.equals(id)){sum+=chooseCourse.get(i).grade;cnt++;} } return sum/=cnt; } public int getAverageCourseUsualGrades(String course){ int sum=0,cnt=0; for(int i=0;i<chooseCourse.size();i++){ if(chooseCourse.get(i).course.equals(course)){sum+=chooseCourse.get(i).UsualGrades;cnt++;} } return sum/=cnt; } public int getAverageCourseFinalGrades(String course){ int sum=0,cnt=0; for(int i=0;i<chooseCourse.size();i++){ if(chooseCourse.get(i).course.equals(course)){sum+=chooseCourse.get(i).FinalGrades;cnt++;} } return sum/=cnt; } public int getAverageCourseGrades(String course){ int sum=0,cnt=0; for(int i=0;i<chooseCourse.size();i++){ if(chooseCourse.get(i).course.equals(course)){sum+=chooseCourse.get(i).grade;cnt++;} } return sum/=cnt; } public int getClassAverageGrades(String Class){ int sum=0,cnt=0; for(int i=0;i<chooseCourse.size();i++){ if(chooseCourse.get(i).Class.equals(Class)){sum+=chooseCourse.get(i).grade;cnt++;} } return sum/=cnt; } public void getAverageGrade(studentList students,courseList courses,Cls cls){ Collections.sort(students.stu, student.getNumberComparator()); Collections.sort(cls.cls, Cls.getIndexComparator()); Collections.sort(courses.courses, course.getChineseNameComparator()); for(int i=0;i<students.stu.size();i++){ int flag=0; for(int j=0;j<i;j++){ if(students.stu.get(j).number.equals(students.stu.get(i).number)){flag=1;break;} } if(flag==1)continue; if(searchId(students.stu.get(i).number)){ System.out.println(students.stu.get(i).number+" "+students.stu.get(i).name+" "+getAverageGrades(students.stu.get(i).number)); } else{ System.out.println(students.stu.get(i).number+" "+students.stu.get(i).name+" did not take any exams"); } } for(int i=0;i<courses.courses.size();i++){ if(searchCourse(courses.courses.get(i).name)){ if(courses.courses.get(i).manner.equals("考试")){ System.out.println(courses.courses.get(i).name+" "+getAverageCourseUsualGrades(courses.courses.get(i).name) +" "+getAverageCourseFinalGrades(courses.courses.get(i).name)+" "+getAverageCourseGrades(courses.courses.get(i).name)); } else System.out.println(courses.courses.get(i).name+" "+getAverageCourseUsualGrades(courses.courses.get(i).name) +" "+getAverageCourseGrades(courses.courses.get(i).name)); } else{ System.out.println(courses.courses.get(i).name+" has no grades yet"); } } for(int i=0;i<cls.cls.size();i++){ int flag=0; for(int j=0;j<i;j++){ if(cls.cls.get(j).equals(cls.cls.get(i))){flag=1;break;} } if(flag==1)continue; if(searchClass(cls.cls.get(i).id)){ System.out.println(cls.cls.get(i).id+" "+getClassAverageGrades(cls.cls.get(i).id)); } else{ System.out.println(cls.cls.get(i).id+" has no grades yet"); } } } } class Cls { private static int nextIndex = 0; String id; private int index; ArrayList<Cls> cls = new ArrayList<>(); public Cls addCls(String cl) { Cls newCls = new Cls(); newCls.id = cl; // 新增元素的 index 应该为当前列表长度 newCls.index = nextIndex++; cls.add(newCls); return newCls; } public boolean searchCls(String id) { for (int i = 0; i < cls.size(); i++) { if (cls.get(i).id.equals(id)) { return true; } } return false; } public static Comparator<Cls> getIndexComparator() { return new Comparator<Cls>() { @Override public int compare(Cls c1, Cls c2) { return c1.id.compareTo(c2.id); } }; } } class InputMatching { static String stuNumMatching = "[0-9]{8}";//8个0-9的数字 static String stuNameMatching = "\\S{1,10}";//1到10个非空格(TAB)字符 static String scoreMatching = "([1-9]?[0-9]|100)"; static String courseNameMatching = "\\S{1,10}";//1到10个非空格(TAB)字符 static String courseTypeMatching = "(选修|必修)"; static String checkcourseTypeMatching = "(考试|考察)"; //cousrInput用于定义课程信息模式(正则表达式) static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; //scoreInput用于定义成绩信息模式(正则表达式) static String scoreInput1 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?"; static String scoreInput2 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?"+" "+scoreMatching + "(scoreMatching)?"; public static int matchingInput(String s) { if (matchingCourse(s)) { return 1; } if (matchingScore1(s)) { return 2; } if (matchingScore2(s)) { return 3; } return 0; } static boolean matchingCourse(String s) { return s.matches(courseInput); } static boolean matchingScore1(String s) { return s.matches(scoreInput1); } static boolean matchingScore2(String s) { return s.matches(scoreInput2); } }
本题对类,对象,循环,数组的知识点均有考察,是一道综合性较强的问题。做题思路:利用while循环,以end为结束标志符实现可控制范围输入,利用对象数组student存储数据,引入一个标志变量flag以判断语句处理数据并进行输出。以下为StudentList关键类的分析,可供参考:
该类用于管理学生对象列表。让我们更详细地分析代码:
类studentList包含两个数组列表:students和stu。这些列表大概存储了student类的实例。
有三种方法可以将学生添加到列表中:
addStudentCompulsory:添加具有必修课程信息的学生,包括他们的编号、姓名、课程、通常成绩和最终成绩。
addStudentTake:添加只选某门课程的学生,包括他们的编号、姓名、课程和通常成绩。
addStudent:只添加一个学生的ID和名字。
方法searchStudent允许在学生数组列表中按名字搜索学生。
以下为类图:

以下为测试结果:
题目集7:
(1)容器-HashMap-检索:
代码如下:
import java.util.*; class Student { String ID; String name; int grade; } public class Main { public static void main(String[] args) { int i = 0; int j = 0; String[] test = new String[1001]; Student[] students = new Student[1001]; for(int z = 0; z < 1001; z++) { students[z] = new Student(); } Scanner scan = new Scanner(System.in); while(true) { String str = scan.nextLine(); test[i] = str; if(test[i].equals("end")) { break; } String[] strParse = test[i].split(" "); students[i].ID = strParse[0]; students[i].name = strParse[1]; students[i].grade = Integer.parseInt(strParse[2]); i++; } String str2 = scan.next(); while(!str2.equals(students[j].ID)) { if(students[j].ID == null) { System.out.println("The student " + str2 + " does not exist"); return; } j++; } System.out.println(students[j].ID + " " + students[j].name + " " + students[j].grade); } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } }
本题考察对字符串的分隔及分析能力,主要考察对spilt方法的使用,以下为测试结果:
(2)7-2 容器-HashMap-排序
代码如下:
import java.util.*; class Student implements Comparable<Student> { String ID; String name; int grade; @Override public int compareTo(Student s) { return Integer.parseInt(s.ID) - Integer.parseInt(this.ID); } } public class Main { public static void main(String[] args) { int i = 0; String[] test = new String[1001]; Student[] students = new Student[1001]; for (int z = 0; z < 1001; z++) { students[z] = new Student(); } Scanner scan = new Scanner(System.in); while (true) { String str = scan.nextLine(); test[i] = str; if (test[i].equals("end")) { break; } String[] strParse = test[i].split(" "); students[i].ID = strParse[0]; students[i].name = strParse[1]; students[i].grade = Integer.parseInt(strParse[2]); i++; } List<Student> list = new ArrayList<Student>(Arrays.asList(students).subList(0, i)); Collections.sort(list); for (Student student : list) { System.out.println(student.ID + " " + student.name + " " + student.grade); } } }
本题考察对字符串的分隔spilt方法及分析能力、对接口comparable或comparator中所提供的排序功能及与之有关的sort语句的使用,以下详细叙述HashMap的使用方法:
创建HashMap对象:
-
HashMap<Key类型, Value类型> hashMap = new HashMap<>();其中,Key表示键的类型,Value表示值的类型。可以根据具体需要选择合适的数据类型。
-
添加键值对:
-
hashMap.put(key, value);使用
put()方法向HashMap中添加键值对,将指定的键和值作为参数传递给该方法。如果键已存在,则新的值将替代旧的值。 -
获取值:
-
ValueType value = hashMap.get(key);使用
get()方法,通过指定的键获取对应的值。如果键不存在,则返回null。 -
删除键值对:
-
hashMap.remove(key);使用
remove()方法,通过指定的键从HashMap中删除对应的键值对。 -
判断键是否存在:
-
boolean containsKey = hashMap.containsKey(key);使用
containsKey()方法,判断HashMap中是否包含指定的键。 -
遍历HashMap: 可以使用循环来遍历HashMap中的所有键值对。例如,可以使用
keySet()方法获取所有的键,然后在循环中访问每个键并获取对应的值。
-
for (Key类型 key : hashMap.keySet()) { ValueType value = hashMap.get(key); // 处理键值对 }
以上是HashMap的基本使用方法。请注意,HashMap中的键是唯一的,如果尝试使用相同的键添加新值,旧值将被替换。此外,HashMap是无序的,即不保证元素的顺序,如果需要有序的Map,可以考虑使用LinkedHashMap。
以下为测试结果:
(3)课程成绩统计程序-2:
代码如下:
import java.text.Collator; import java.util.*; public class Main { static boolean isNumber(String isNumber) { try { int a = Integer.parseInt(isNumber); } catch (NumberFormatException e) { return false; } return true; } public static void main(String[] args) { Scanner input = new Scanner(System.in); String str = ""; StudentList students = new StudentList(); InputMatching matching = new InputMatching(); ChooseCourseList choose = new ChooseCourseList(); Cls cls = new Cls(); CourseList course = new CourseList(); String str1, str2, str3; while (true) { str = input.nextLine(); if (isNumber(str.split(" ")[0])) break; if (str.equals("end")) break; if (InputMatching.matchingInput(str) != 1) { System.out.println("wrong format"); continue; } str1 = str.split(" ")[0]; if (course.searchCourse(str1)) continue; str2 = str.split(" ")[1]; str3 = str.split(" ")[2]; if ((str2.equals("必修") && str3.equals("考察")) || (str2.equals("实验") && !str3.equals("实验") || (!str2.equals("实验") && str3.equals("实验")))) { System.out.println(str.split(" ")[0] + " : course type & access mode mismatch"); continue; } if (course.searchCourse(str1)) continue; course.courses.add(course.addCourse(str1, str2, str3)); } String number, name, subject; int UsualGrades, FinalGrades; boolean flag = false; while (!str.equals("end")) { if (flag) str = input.nextLine(); flag = true; if (str.equals("end")) break; String ssr = str.split(" ")[0] + " " + str.split(" ")[1] + " " + str.split(" ")[2] + " " + str.split(" ")[3]; if (InputMatching.matchingInput(ssr) != 2 && InputMatching.matchingInput(ssr) != 3 && course.searchQuality(str.split(" ")[2]) != 2) { System.out.println("wrong format");// 字符串符合成绩信息模式 continue; } if (((Integer.parseInt(str.split(" ")[3])) < 4 || (Integer.parseInt(str.split(" ")[3])) > 9) && str.split(" ").length > 5) { System.out.println("wrong format"); continue; } number = str.split(" ")[0]; String Class = number.substring(0, 6); if (!cls.searchCls(Class)) cls.cls.add(cls.addCls(Class)); name = str.split(" ")[1]; students.stu.add(students.addStudent(number, name)); subject = str.split(" ")[2]; try { if (course.searchQuality(subject) == 1) { UsualGrades = Integer.parseInt(str.split(" ")[3]); if (choose.searchCourse(subject) && choose.searchId(number)) continue; FinalGrades = Integer.parseInt(str.split(" ")[4]); students.students.add(students.addStudentCompulsory(number, name, subject, UsualGrades, FinalGrades)); } else if (course.searchQuality(subject) == 0) { UsualGrades = Integer.parseInt(str.split(" ")[3]); if (choose.searchCourse(subject) && choose.searchId(number)) continue; if (str.split(" ").length > 4) { System.out.println(number + " " + name + " : access mode mismatch"); continue; } students.students.add(students.addStudentTake(number, name, subject, UsualGrades)); } else if (course.searchQuality(subject) == -1) { System.out.println(subject + " does not exist"); } else if (course.searchQuality(subject) == 2) { int testNumber = Integer.parseInt(str.split(" ")[3]); if (str.split(" ").length - 4 != testNumber) { System.out.println(number + " " + name + " : access mode mismatch"); continue; } int sum = 0; for (int i = 0; i < testNumber; i++) { sum += Integer.parseInt(str.split(" ")[4 + i]); } sum /= testNumber; students.students.add(students.addExperimentalGrades(number, name, subject, sum)); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println(number + " " + name + " : access mode mismatch"); } } ChooseCourseList chooses = new ChooseCourseList(); chooses.getAverageGrade(students, course, cls); } } class StudentList { ArrayList<Student> students = new ArrayList<>(); ArrayList<Student> stu = new ArrayList<>(); Student addStudentCompulsory(String number, String name, String course, int UsualGrades, int FinalGrades) { Student newStudent = new Student(); ChooseCourseList newChoose = new ChooseCourseList(); newStudent.name = name; if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; Cls newCls = new Cls(); newStudent.number = number; newStudent.course = course; newStudent.grade = (int) (FinalGrades * 0.7 + UsualGrades * 0.3); String Class = number.substring(0, 6); if (!newCls.searchCls(Class)) newCls.cls.add(newCls.addCls(Class)); ChooseCourseList.chooseCourse.add(newChoose.addChoose(number, name, course, Class, UsualGrades, FinalGrades, newStudent.grade)); return newStudent; } Student addStudentTake(String number, String name, String course, int UsualGrades) { Student newStudent = new Student(); newStudent.name = name; newStudent.number = number; newStudent.course = course; newStudent.grade = UsualGrades; String Class = number.substring(0, 6); ChooseCourseList newChoose = new ChooseCourseList(); if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; ChooseCourseList.chooseCourse.add(newChoose.addChooseTake(number, name, course, Class, UsualGrades, newStudent.grade)); return newStudent; } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } Student addExperimentalGrades(String number, String name, String course, int experimentalGrades) { Student newStudent = new Student(); newStudent.name = name; newStudent.number = number; newStudent.course = course; newStudent.experimentalGrades = experimentalGrades; newStudent.grade = experimentalGrades; String Class = number.substring(0, 6); ChooseCourseList newChoose = new ChooseCourseList(); if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; ChooseCourseList.chooseCourse.add(newChoose.addChooseExperimental(number, name, course, Class, experimentalGrades, newStudent.grade)); return newStudent; } Student addStudent(String id, String name) { Student newStudent = new Student(); newStudent.number = id; newStudent.name = name; return newStudent; } boolean searchStudent(String name) { for (Student student : students) { if (student.name.equals(name)) return true; } return false; } } class Student { int experimentalGrades; String number; String name; String course; int UsualGrades = 0; int FinalGrades = 0; String Class; int grade = 0; public static Comparator<Student> getNumberComparator() { return (s1, s2) -> s1.number.compareTo(s2.number); } } class Course { String name; String quality; String manner; public static Comparator<Course> getChineseNameComparator() { final Collator collator = Collator.getInstance(java.util.Locale.CHINA); // 获取中文排序规则 return (c1, c2) -> collator.compare(c1.name, c2.name); } } class CourseList { ArrayList<Course> courses = new ArrayList<>(); boolean searchCourse(String CourseName) { for (Course cours : courses) if (cours.name.equals(CourseName)) return true; return false; } Course addCourse(String name, String quality, String manner) { Course newCourse = new Course(); newCourse.name = name; newCourse.quality = quality; newCourse.manner = manner; return newCourse; } int searchQuality(String subject) { for (Course cours : courses) { if (cours.name.equals(subject) && cours.quality.equals("必修")) return 1; else if (cours.name.equals(subject) && cours.manner.equals("考试")) return 1; else if (cours.name.equals(subject) && cours.quality.equals("实验")) return 2; else if (cours.name.equals(subject) && cours.manner.equals("实验")) return 2; else if (cours.name.equals(subject)) return 0; } return -1; } } class Cls { private static int nextIndex = 0; String id; private int index; ArrayList<Cls> cls = new ArrayList<>(); public Cls addCls(String cl) { Cls newCls = new Cls(); newCls.id = cl; // 新增元素的 index 应该为当前列表长度 newCls.index = nextIndex++; cls.add(newCls); return newCls; } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } public boolean searchCls(String id) { for (int i = 0; i < cls.size(); i++) { if (cls.get(i).id.equals(id)) { return true; } } return false; } public static Comparator<Cls> getIndexComparator() { return new Comparator<Cls>() { @Override public int compare(Cls c1, Cls c2) { return c1.id.compareTo(c2.id); } }; } } class InputMatching { static String stuNumMatching = "[0-9]{8}"; static String stuNameMatching = "\\S{1,10}"; static String scoreMatching = "([1-9]?[0-9]|100)"; static String courseNameMatching = "\\S{1,10}"; static String courseTypeMatching = "(选修|必修|实验)"; static String checkcourseTypeMatching = "(考试|考察|实验)"; static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; static String scoreInput1 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?"; static String scoreInput2 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?" + " " + scoreMatching + "(scoreMatching)?"; public static int matchingInput(String s) { if (matchingCourse(s)) { return 1; } if (matchingScore1(s)) { return 2; } if (matchingScore2(s)) { return 3; } return 0; } static boolean matchingCourse(String s) { return s.matches(courseInput); } static boolean matchingScore1(String s) { return s.matches(scoreInput1); } static boolean matchingScore2(String s) { return s.matches(scoreInput2); } } class ChooseCourseList { static ArrayList<Student> chooseCourse = new ArrayList<>(); static boolean searchId(String id) { for (Student student : chooseCourse) if (student.number.equals(id)) return true; return false; } static boolean searchCourse(String course) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).course.equals(course)) return true; return false; } static int searchCourseInt(String course) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).course.equals(course)) return i; return -1; } static boolean searchClass(String Class) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).Class.equals(Class)) return true; return false; } Student addChoose(String id, String name, String course, String Class, int UsualGrades, int FinalGrades, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.UsualGrades = UsualGrades; newStudent.FinalGrades = FinalGrades; newStudent.grade = grade; return newStudent; } Student addChooseTake(String id, String name, String course, String Class, int UsualGrades, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.UsualGrades = UsualGrades; newStudent.grade = grade; return newStudent; } Student addChooseExperimental(String id, String name, String course, String Class, int experimental, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.experimentalGrades = experimental; newStudent.grade = experimental; return newStudent; } public int getAverageGrades(String id) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).number.equals(id)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public int getAverageCourseUsualGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).UsualGrades; cnt++; } } return sum /= cnt; } public int getAverageCourseFinalGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).FinalGrades; cnt++; } } return sum /= cnt; } public int getAverageCourseGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public int getAverageExperimentalGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).experimentalGrades; cnt++; } } return sum /= cnt; } public int getClassAverageGrades(String Class) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).Class.equals(Class)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public void getAverageGrade(StudentList students, CourseList courses, Cls cls) { Collections.sort(students.stu, Student.getNumberComparator()); Collections.sort(cls.cls, Cls.getIndexComparator()); Collections.sort(courses.courses, Course.getChineseNameComparator()); for (int i = 0; i < students.stu.size(); i++) { int flag = 0; for (int j = 0; j < i; j++) { if (students.stu.get(j).number.equals(students.stu.get(i).number)) { flag = 1; break; } } if (flag == 1) continue; if (searchId(students.stu.get(i).number)) { System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " " + getAverageGrades(students.stu.get(i).number)); } else { System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " did not take any exams"); } } for (int i = 0; i < courses.courses.size(); i++) { if (searchCourse(courses.courses.get(i).name)) { if (courses.courses.get(i).manner.equals("考试")) { System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name) + " " + getAverageCourseFinalGrades(courses.courses.get(i).name) + " " + getAverageCourseGrades(courses.courses.get(i).name)); } else if (courses.courses.get(i).manner.equals("考察")) System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name) + " " + getAverageCourseGrades(courses.courses.get(i).name)); else System.out.println(courses.courses.get(i).name + " " + getAverageExperimentalGrades(courses.courses.get(i).name)); } else { System.out.println(courses.courses.get(i).name + " has no grades yet"); } } for (int i = 0; i < cls.cls.size(); i++) { int flag = 0; for (int j = 0; j < i; j++) { if (cls.cls.get(j).equals(cls.cls.get(i))) { flag = 1; break; } } if (flag == 1) continue; if (searchClass(cls.cls.get(i).id)) { System.out.println(cls.cls.get(i).id + " " + getClassAverageGrades(cls.cls.get(i).id)); } else { System.out.println(cls.cls.get(i).id + " has no grades yet"); } } } }
本题对类,对象,循环,数组的知识点均有考察,是一道综合性较强的问题。做题思路:利用while循环,以end为结束标志符实现可控制范围输入,利用对象数组student存储数据,引入一个标志变量flag以判断语句处理数据并进行输出。以下是对InputMatching关键类的分析:
其中包含几个用于匹配输入字符串的静态字符串模式。让我们进一步分析代码:
1. 该类使用正则表达式定义了几个静态字符串变量:
—“stuNumMatching”:匹配8位数字的字符串。
—“stuNameMatching”:匹配由1 ~ 10个非空白字符组成的字符串。
—' scoreMatching ':匹配一个表示0到100分的字符串。
—“courseNameMatching”:匹配由1 ~ 10个非空白字符组成的字符串。
- ' courseTypeMatching ':匹配一个字符串,该字符串可以是"踢脚"(选修),"踢脚"(必修课),或"踢脚"(实验)。
-“checkcourseTypeMatching”:匹配一个字符串,可以是“考试”、“评估”或“实验”。
2. 该类定义了' courseInput '、' scoreinputt1 '和' scoreInput2 '字符串变量,并结合各自的模式来定义特定的输入格式。
3.方法' matchingInput '接受一个输入字符串' s ',并通过调用以下方法检查它匹配的模式:
- ' matchingCourse ':匹配' s '匹配' courseInput '模式。
- ' matchingScore1 ':如果' s '匹配' scoreInput1 '模式,则匹配。
- ' matchingScore2 ':如果' s '匹配' scoreInput2 '模式,则匹配。
4. ' matchingInput '方法返回一个整数值,指示匹配的输入格式类型(1表示课程输入,2表示分数输入类型1,3表示分数输入类型2)。如果没有找到匹配,它返回0。
该类主要用于通过将输入字符串与预定义模式进行匹配来进行输入验证。
以下为类图:

以下为测试结果:
(4)7-4 动物发声模拟器(多态)
代码如下:
public class Main { public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); Goat goat = new Goat(); speak(cat); speak(dog); speak(goat); } public static void speak(Animal animal) { System.out.println(animal.getAnimalClass() + "的叫声:" + animal.shout()); } } class Animal { public String getAnimalClass() { return "adsd"; } public String shout() { return "grgrv"; } } class Cat extends Animal { @Override public String getAnimalClass() { return "猫"; } @Override public String shout() { return "喵喵"; } } class Dog extends Animal { @Override public String getAnimalClass() { return "狗"; } @Override public String shout() { return "汪汪"; } } class Goat extends Animal { @Override public String getAnimalClass() { return "山羊"; } @Override public String shout() { return "咩咩"; } }
以下为java中多态的详细阐述:
多态是面向对象程序设计中的重要概念,它允许不同类型的对象对同一消息做出不同的响应。在Java中,多态主要通过继承和方法重写来实现。下面详细阐述Java中的多态性:
-
继承: 在Java中,一个类可以从另一个类派生(继承)而来。继承关系形成了父类(基类)和子类(派生类)之间的层次结构。子类可以继承父类的属性和方法,并可以根据需要添加新的属性和方法。继承使得子类具有父类的特征和行为。
-
方法重写: 子类可以重写(覆盖)从父类继承而来的方法。重写是指在子类中定义一个与父类中同名、参数列表一致的方法,但其实现可能不同于父类。使用
@Override注解可以确保方法的正确重写。方法重写允许子类根据自身的需求重新实现方法逻辑。 -
多态性: 多态性是指同一个类型或接口的对象,在不同的情况下表现出不同的行为。在Java中,通过使用父类引用指向子类对象实例,以及方法的动态绑定,实现了多态性的特性。这意味着可以用父类的引用来操作各个子类对象,调用同一个方法时会根据实际类型来执行不同的方法逻辑。
使用多态的好处之一是增加了程序的灵活性和可扩展性。可以通过共享父类引用来操作不同的子类对象,允许在不修改现有代码的情况下简化了代码结构。
以下为测试结果:
题目集8:
(1)7-1 容器-ArrayList-排序:
代码如下:
import java.util.*; class Student implements Comparator<Student> { String ID; String name; int gradeMath; int gradePhysics; int gradeTotal; @Override public int compare(Student o1, Student o2) { return (o1.gradeTotal - o2.gradeTotal) * -1; } } public class Main { public static void main(String[] args) { int i = 0; int j = 0; String[] test = new String[1001]; Student[] students = new Student[1001]; for(int z = 0; z < 1001; z++) { students[z] = new Student(); } Scanner scan = new Scanner(System.in); while(true) { String str = scan.nextLine(); test[i] = str; if(test[i].equals("end")) { break; } String[] strParse = test[i].split(" "); students[i].ID = strParse[0]; students[i].name = strParse[1]; students[i].gradeMath = Integer.parseInt(strParse[2]); students[i].gradePhysics = Integer.parseInt(strParse[3]); students[i].gradeTotal = students[i].gradeMath + students[i].gradePhysics; i++; } List<Student> list = new ArrayList<>(Arrays.asList(students).subList(0, i)); Collections.sort(list, new Student()); for(Student student:list) { System.out.println(student.ID + " " + student.name + " " + student.gradeTotal); } } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } }
本题思路:通过接口comparator中的compare方法并对其进行重写,用一个list进行接收,最后利用sort方法对此进行排序。以下为测试结果:
(2)7-2 课程成绩统计程序-3:
代码如下:
import java.text.Collator; import java.util.*; public class Main { static boolean isNumber(String isNumber) { try { int a = Integer.parseInt(isNumber); } catch (NumberFormatException e) { return false; } return true; } public static void main(String[] args) { Scanner input = new Scanner(System.in); String str = ""; StudentList students = new StudentList(); InputMatching matching = new InputMatching(); ChooseCourseList choose = new ChooseCourseList(); Cls cls = new Cls(); CourseList course = new CourseList(); String str1, str2, str3; while (true) { str = input.nextLine(); if (isNumber(str.split(" ")[0])) break; if (str.equals("end")) break; if (InputMatching.matchingInput(str) != 1) { System.out.println("wrong format"); continue; } str1 = str.split(" ")[0]; if (course.searchCourse(str1)) continue; str2 = str.split(" ")[1]; str3 = str.split(" ")[2]; if ((str2.equals("必修") && str3.equals("考察")) || (str2.equals("实验") && !str3.equals("实验") || (!str2.equals("实验") && str3.equals("实验")))) { System.out.println(str.split(" ")[0] + " : course type & access mode mismatch"); continue; } if (course.searchCourse(str1)) continue; course.courses.add(course.addCourse(str1, str2, str3)); } String number, name, subject; int UsualGrades, FinalGrades; boolean flag = false; while (!str.equals("end")) { if (flag) str = input.nextLine(); flag = true; if (str.equals("end")) break; String ssr = str.split(" ")[0] + " " + str.split(" ")[1] + " " + str.split(" ")[2] + " " + str.split(" ")[3]; if (InputMatching.matchingInput(ssr) != 2 && InputMatching.matchingInput(ssr) != 3 && course.searchQuality(str.split(" ")[2]) != 2) { System.out.println("wrong format");// 字符串符合成绩信息模式 continue; } if (((Integer.parseInt(str.split(" ")[3])) < 4 || (Integer.parseInt(str.split(" ")[3])) > 9) && str.split(" ").length > 5) { System.out.println("wrong format"); continue; } number = str.split(" ")[0]; String Class = number.substring(0, 6); if (!cls.searchCls(Class)) cls.cls.add(cls.addCls(Class)); name = str.split(" ")[1]; students.stu.add(students.addStudent(number, name)); subject = str.split(" ")[2]; try { if (course.searchQuality(subject) == 1) { UsualGrades = Integer.parseInt(str.split(" ")[3]); if (choose.searchCourse(subject) && choose.searchId(number)) continue; FinalGrades = Integer.parseInt(str.split(" ")[4]); students.students.add(students.addStudentCompulsory(number, name, subject, UsualGrades, FinalGrades)); } else if (course.searchQuality(subject) == 0) { UsualGrades = Integer.parseInt(str.split(" ")[3]); if (choose.searchCourse(subject) && choose.searchId(number)) continue; if (str.split(" ").length > 4) { System.out.println(number + " " + name + " : access mode mismatch"); continue; } students.students.add(students.addStudentTake(number, name, subject, UsualGrades)); } else if (course.searchQuality(subject) == -1) { System.out.println(subject + " does not exist"); } else if (course.searchQuality(subject) == 2) { int testNumber = Integer.parseInt(str.split(" ")[3]); if (str.split(" ").length - 4 != testNumber) { System.out.println(number + " " + name + " : access mode mismatch"); continue; } int sum = 0; for (int i = 0; i < testNumber; i++) { sum += Integer.parseInt(str.split(" ")[4 + i]); } sum /= testNumber; students.students.add(students.addExperimentalGrades(number, name, subject, sum)); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println(number + " " + name + " : access mode mismatch"); } } ChooseCourseList chooses = new ChooseCourseList(); chooses.getAverageGrade(students, course, cls); } } class StudentList { ArrayList<Student> students = new ArrayList<>(); ArrayList<Student> stu = new ArrayList<>(); Student addStudentCompulsory(String number, String name, String course, int UsualGrades, int FinalGrades) { Student newStudent = new Student(); ChooseCourseList newChoose = new ChooseCourseList(); newStudent.name = name; if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; Cls newCls = new Cls(); newStudent.number = number; newStudent.course = course; newStudent.grade = (int) (FinalGrades * 0.7 + UsualGrades * 0.3); String Class = number.substring(0, 6); if (!newCls.searchCls(Class)) newCls.cls.add(newCls.addCls(Class)); ChooseCourseList.chooseCourse.add(newChoose.addChoose(number, name, course, Class, UsualGrades, FinalGrades, newStudent.grade)); return newStudent; } Student addStudentTake(String number, String name, String course, int UsualGrades) { Student newStudent = new Student(); newStudent.name = name; newStudent.number = number; newStudent.course = course; newStudent.grade = UsualGrades; String Class = number.substring(0, 6); ChooseCourseList newChoose = new ChooseCourseList(); if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; ChooseCourseList.chooseCourse.add(newChoose.addChooseTake(number, name, course, Class, UsualGrades, newStudent.grade)); return newStudent; } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } Student addExperimentalGrades(String number, String name, String course, int experimentalGrades) { Student newStudent = new Student(); newStudent.name = name; newStudent.number = number; newStudent.course = course; newStudent.experimentalGrades = experimentalGrades; newStudent.grade = experimentalGrades; String Class = number.substring(0, 6); ChooseCourseList newChoose = new ChooseCourseList(); if (ChooseCourseList.searchCourse(course) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).name.equals(name) && ChooseCourseList.chooseCourse.get(ChooseCourseList.searchCourseInt(course)).number.equals(number)) return null; ChooseCourseList.chooseCourse.add(newChoose.addChooseExperimental(number, name, course, Class, experimentalGrades, newStudent.grade)); return newStudent; } Student addStudent(String id, String name) { Student newStudent = new Student(); newStudent.number = id; newStudent.name = name; return newStudent; } boolean searchStudent(String name) { for (Student student : students) { if (student.name.equals(name)) return true; } return false; } } class Student { int experimentalGrades; String number; String name; String course; int UsualGrades = 0; int FinalGrades = 0; String Class; int grade = 0; public static Comparator<Student> getNumberComparator() { return (s1, s2) -> s1.number.compareTo(s2.number); } } class Course { String name; String quality; String manner; public static Comparator<Course> getChineseNameComparator() { final Collator collator = Collator.getInstance(java.util.Locale.CHINA); // 获取中文排序规则 return (c1, c2) -> collator.compare(c1.name, c2.name); } } class CourseList { ArrayList<Course> courses = new ArrayList<>(); boolean searchCourse(String CourseName) { for (Course cours : courses) if (cours.name.equals(CourseName)) return true; return false; } Course addCourse(String name, String quality, String manner) { Course newCourse = new Course(); newCourse.name = name; newCourse.quality = quality; newCourse.manner = manner; return newCourse; } int searchQuality(String subject) { for (Course cours : courses) { if (cours.name.equals(subject) && cours.quality.equals("必修")) return 1; else if (cours.name.equals(subject) && cours.manner.equals("考试")) return 1; else if (cours.name.equals(subject) && cours.quality.equals("实验")) return 2; else if (cours.name.equals(subject) && cours.manner.equals("实验")) return 2; else if (cours.name.equals(subject)) return 0; } return -1; } } class Cls { private static int nextIndex = 0; String id; private int index; ArrayList<Cls> cls = new ArrayList<>(); public Cls addCls(String cl) { Cls newCls = new Cls(); newCls.id = cl; // 新增元素的 index 应该为当前列表长度 newCls.index = nextIndex++; cls.add(newCls); return newCls; } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } public boolean searchCls(String id) { for (int i = 0; i < cls.size(); i++) { if (cls.get(i).id.equals(id)) { return true; } } return false; } public static Comparator<Cls> getIndexComparator() { return new Comparator<Cls>() { @Override public int compare(Cls c1, Cls c2) { return c1.id.compareTo(c2.id); } }; } } class InputMatching { static String stuNumMatching = "[0-9]{8}"; static String stuNameMatching = "\\S{1,10}"; static String scoreMatching = "([1-9]?[0-9]|100)"; static String courseNameMatching = "\\S{1,10}"; static String courseTypeMatching = "(选修|必修|实验)"; static String checkcourseTypeMatching = "(考试|考察|实验)"; static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; static String scoreInput1 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?"; static String scoreInput2 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(scoreMatching)?" + " " + scoreMatching + "(scoreMatching)?"; public static int matchingInput(String s) { if (matchingCourse(s)) { return 1; } if (matchingScore1(s)) { return 2; } if (matchingScore2(s)) { return 3; } return 0; } static boolean matchingCourse(String s) { return s.matches(courseInput); } static boolean matchingScore1(String s) { return s.matches(scoreInput1); } static boolean matchingScore2(String s) { return s.matches(scoreInput2); } } class ChooseCourseList { static ArrayList<Student> chooseCourse = new ArrayList<>(); static boolean searchId(String id) { for (Student student : chooseCourse) if (student.number.equals(id)) return true; return false; } static boolean searchCourse(String course) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).course.equals(course)) return true; return false; } static int searchCourseInt(String course) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).course.equals(course)) return i; return -1; } static boolean searchClass(String Class) { for (int i = 0; i < chooseCourse.size(); i++) if (chooseCourse.get(i).Class.equals(Class)) return true; return false; } Student addChoose(String id, String name, String course, String Class, int UsualGrades, int FinalGrades, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.UsualGrades = UsualGrades; newStudent.FinalGrades = FinalGrades; newStudent.grade = grade; return newStudent; } Student addChooseTake(String id, String name, String course, String Class, int UsualGrades, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.UsualGrades = UsualGrades; newStudent.grade = grade; return newStudent; } Student addChooseExperimental(String id, String name, String course, String Class, int experimental, int grade) { Student newStudent = new Student(); newStudent.Class = Class; newStudent.number = id; newStudent.name = name; newStudent.course = course; newStudent.experimentalGrades = experimental; newStudent.grade = experimental; return newStudent; } public int getAverageGrades(String id) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).number.equals(id)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public int getAverageCourseUsualGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).UsualGrades; cnt++; } } return sum /= cnt; } public int getAverageCourseFinalGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).FinalGrades; cnt++; } } return sum /= cnt; } public int getAverageCourseGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public int getAverageExperimentalGrades(String course) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).course.equals(course)) { sum += chooseCourse.get(i).experimentalGrades; cnt++; } } return sum /= cnt; } public int getClassAverageGrades(String Class) { int sum = 0, cnt = 0; for (int i = 0; i < chooseCourse.size(); i++) { if (chooseCourse.get(i).Class.equals(Class)) { sum += chooseCourse.get(i).grade; cnt++; } } return sum /= cnt; } public void getAverageGrade(StudentList students, CourseList courses, Cls cls) { Collections.sort(students.stu, Student.getNumberComparator()); Collections.sort(cls.cls, Cls.getIndexComparator()); Collections.sort(courses.courses, Course.getChineseNameComparator()); for (int i = 0; i < students.stu.size(); i++) { int flag = 0; for (int j = 0; j < i; j++) { if (students.stu.get(j).number.equals(students.stu.get(i).number)) { flag = 1; break; } } if (flag == 1) continue; if (searchId(students.stu.get(i).number)) { System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " " + getAverageGrades(students.stu.get(i).number)); } else { System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " did not take any exams"); } } for (int i = 0; i < courses.courses.size(); i++) { if (searchCourse(courses.courses.get(i).name)) { if (courses.courses.get(i).manner.equals("考试")) { System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name) + " " + getAverageCourseFinalGrades(courses.courses.get(i).name) + " " + getAverageCourseGrades(courses.courses.get(i).name)); } else if (courses.courses.get(i).manner.equals("考察")) System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name) + " " + getAverageCourseGrades(courses.courses.get(i).name)); else System.out.println(courses.courses.get(i).name + " " + getAverageExperimentalGrades(courses.courses.get(i).name)); } else { System.out.println(courses.courses.get(i).name + " has no grades yet"); } } for (int i = 0; i < cls.cls.size(); i++) { int flag = 0; for (int j = 0; j < i; j++) { if (cls.cls.get(j).equals(cls.cls.get(i))) { flag = 1; break; } } if (flag == 1) continue; if (searchClass(cls.cls.get(i).id)) { System.out.println(cls.cls.get(i).id + " " + getClassAverageGrades(cls.cls.get(i).id)); } else { System.out.println(cls.cls.get(i).id + " has no grades yet"); } } } }
本题对类,对象,循环,数组的知识点均有考察,是一道综合性较强的问题。做题思路:利用while循环,以end为结束标志符实现可控制范围输入,利用对象数组student存储数据,引入一个标志变量flag以判断语句处理数据并进行输出。以下是对Student关键类的分析:
它管理一个“Course”对象列表。让我们更详细地分析代码:
1. 类' CourseList '包含一个名为' courses '的数组列表,它大概存储了' Course '类的实例。
2. 这个类提供了三个方法:
- ' searchCourse ':在' courses '数组列表中按名称搜索课程。如果找到具有指定名称的课程,则返回true,否则返回false。
—' addCourse ':以指定的名称、质量和方式向' courses '数组列表中添加一个新课程。它返回新创建的' Course '对象。
-“搜索质量”:搜索指定科目课程的质量(必修或实验)。它返回一个指示质量类型的整数值:1表示必修课程,2表示实验课程,如果课程存在,但与这两种类型都不匹配,则返回0。如果没有找到课程,则返回-1。
这个类主要用于管理和搜索“CourseList”中的课程。
以下为类图:

以下为测试结果:
(3) jmu-Java-02基本语法-03-身份证排序
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scanner (System.in); int n; n=sc.nextInt(); String s[]=new String[n]; String birth[]=new String[n]; String str; for(int i=0;i<n;i++) { s[i]=sc.next(); } while(true) { str=sc.next(); if(str.equals("e")) { System.out.println("exit"); break; }else if(str.equals("sort1")) { for(int i=0;i<n;i++) { birth[i]=s[i].substring(6,10 )+'-'+ s[i].substring(10, 12)+'-'+s[i].substring(12, 14); } Arrays.sort(birth); for(int i=0;i<n;i++) { System.out.println(birth[i]); } }else if(str.equals("sort2")) { for(int i=0;i<n;i++) { birth[i]=s[i].substring(6,10 )+ s[i].substring(10, 12)+s[i].substring(12, 14); } Arrays.sort(birth); for(int i=0;i<n;i++) { for(int j=0;j<n;j++){ if(s[j].contains(birth[i])) { System.out.println(s[j]); break; } } } } } } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } }
以下为测试结果:
(4)jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack:
代码如下:
import java.util.*; class ArrayIntegerStack implements IntegerStack{ private Integer[] arr; private int top = 0; public ArrayIntegerStack(int n){ arr = new Integer[n]; Arrays.fill(arr, null); } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } public ArrayIntegerStack(){} @Override public String toString() { return Arrays.toString(arr); } @Override public Integer push(Integer item) { if (item == null || arr.length == top){ return null; } arr[top++] = item; return item; } @Override public Integer pop() { if (top == 0){ return null; } return arr[--top]; } @Override public Integer peek() { if (top == 0){ return null; } return arr[top - 1]; } @Override public boolean empty() { return top == 0; } @Override public int size() { return top; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); ArrayIntegerStack ais = new ArrayIntegerStack(n); int m = scanner.nextInt(); while(m-- > 0){ int item = scanner.nextInt(); System.out.println(ais.push(item)); } System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size()); System.out.println(ais); int x = scanner.nextInt(); while(x-- > 0){ System.out.println(ais.pop()); } System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size()); System.out.println(ais); } } interface IntegerStack { public Integer push(Integer item); public Integer pop(); public Integer peek(); public boolean empty(); public int size(); }
以下为测试结果:
(5)7-5 jmu-Java-03面向对象基础-05-覆盖:
代码如下:
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n1 = in.nextInt(); int i; PersonOverride person1[] = new PersonOverride[n1]; for (i = 0; i < n1; i++) { person1[i] = new PersonOverride(); } int n2 = in.nextInt(); PersonOverride person2[] = new PersonOverride[n2]; int count=0; PersonOverride p = null; for (i = 0; i < n2; i++) { p = new PersonOverride(in.next(), in.nextInt(), in.nextBoolean()); int j = 0; while (j < count) { if (p.equals(person2[j])) break; j++; } if (j >= count) { person2[count] = p; count++; } } in.close(); for(i=0;i<n1;i++) { System.out.println(person1[i].toString()); } for (i = 0; i < count; i++) { System.out.println(person2[i].toString()); } System.out.println(count); System.out.println(Arrays.toString(PersonOverride.class.getConstructors())); } } class PersonOverride { private String name; private int age; private boolean gender; public PersonOverride() { this("default", 1, true); } public PersonOverride(String name, int age, boolean gender) { this.name=name; this.age=age; this.gender=gender; } @Override public String toString() { return name + "-" + age + "-"+ gender; } public static boolean checkDateFormat(String tempDate) { if (tempDate.length() != 10 ){ return false; } for (int i = 0; i < 4; i++) { if (tempDate.charAt(i) > 57 || tempDate.charAt(i) < 48) { return false; } } if (tempDate.charAt(5) > 57 || tempDate.charAt(5) < 48 || tempDate.charAt(6) > 57 || tempDate.charAt(6) < 48) { return false; } if (tempDate.charAt(8) > 57 || tempDate.charAt(8) < 48 || tempDate.charAt(9) > 57 || tempDate.charAt(9) < 48) { return false; } if (tempDate.charAt(7) !=45 || tempDate.charAt(4) !=45) { return false; } if (tempDate.charAt(5) > 49 || (tempDate.charAt(5) == 49 && tempDate.charAt(6) > 50)) { return false; } if (tempDate.charAt(8) > 51 || (tempDate.charAt(8) == 51 && tempDate.charAt(9) > 49)) { return false; } return true; } public static boolean checkSpecialDate(int[] arrayTemp) { if (arrayTemp[1] == 2 && arrayTemp[2] > 29) { return false; } if (arrayTemp[1] < 8) { if (arrayTemp[1] % 2 == 0 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[1] > 7) { if (arrayTemp[1] % 2 == 1 && arrayTemp[2] > 30) {return false;} } if (arrayTemp[0] % 4 != 0 || (arrayTemp[0] % 100 == 0 && arrayTemp[0] % 400 != 0)) { if (arrayTemp[1] == 2 && arrayTemp[2] > 28) {return false;} } return true; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + (gender ? 1231 : 1237); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PersonOverride other = (PersonOverride) obj; if (age != other.age) return false; if (gender != other.gender) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
以下为测试结果:
总结:面对题目集6-8中的具体实际问题的第一步是问题分析和需求定义。我们需要深入了解问题的背景和需求,明确解决方案的目标。然后,我们可以使用Java的面向对象编程来进行系统设计和结构化编码。在编程过程中,合理的代码组织和设计是非常重要的。可以使用类和对象来表示问题中的概念和实体,将功能模块化并降低代码的耦合度。内容组织循序渐进,通过数学,经济,游戏等应用领域的生动案例来引导我们的程序设计的学习,避免了单纯语法学习的枯燥,也让我们可以学以致用;其中的部分题目具有一定的思维难度,能考察我们对较为复杂的需求的处理方法,为之后的程序员工作中可能遇到的一些特殊情况进行预演。总而言之,这些题目对我们的代码水平要求逐渐提升,让我们的编程思维一步步变得更完善。