一、前言
本次题目集由oop8-11训练集所组成,题目集里主要由课程成绩统计程序、用set及map统计java程序中关键词的出现次数、用HashMap进行索检以及排序、ArrayList排序、身份证排序、ArrayIntegerStack、覆盖,其中课程成绩统计程序进行了三次迭代。
二、设计与分析
OOP8训练题集总结
第一题:课程成绩统计程序-1:
本题我创了Student、Course、CourseLIst、Class、Choose、Score、ExamScore、AssessmentScore以及Main类
在Main类中将输入的每行内容通过空格分开,然后再依次放入字符串数组array里,再通过字符串长度来识别输入的是课程信息还是学生信息,如果长度为3,就是课程信息,把课程的名字、类型、考试方式放到CourseList的ArrayLIst里面;如果长度为4或者5,就是学生信息,就分别把学号和班号放入Choose类的的ArrayList里,把学生的考试科目以及成绩放入Student类的ArrayList里面。
while(!str.equals("end")) {
String[]array=str.split(" ");
if(array.length==3) {
course1=array[0];
sort=array[1];
examsort=array[2];
courselist.addTocourselist(array[0], array[1], array[2]);
}
if(array.length==4) {
number=Integer.parseInt(array[0]);
classnumber=number/100;
name=array[1];
course1=array[2];
score1=Integer.parseInt(array[3]);
if(!array[0].matches("[0-9]{8}")||name.length()>10||score1>100||score1<0||course1.length()>10){
System.out.println("wrong format");
}else{
choose.addclass(classnumber);
for(int i=0;i<choose.aclass.size();i++) {
if(choose.aclass.get(i).getClassnumber()==classnumber) {
choose.aclass.get(i).addstudent(number, name);
choose.aclass.get(i).student1.get(choose.aclass.get(i).student1.size() - 1).addstudentcourse(courselist, course1, score1);
break;
}
}
}
}
然后再对数据进行排序
for(int i=0;i<choose.aclass.size();i++){
Collections.sort(choose.aclass.get(i).student1,new Comparator<Student>(){
@Override
public int compare(Student o1,Student o2){
return o1.number-o2.number;
}
});
}
Collections.sort(courselist.courselist, new Comparator<Course>() {
@Override
public int compare(Course o1, Course o2) {
Comparator<Object> compare=Collator.getInstance(java.util.Locale.CHINA);
return compare.compare(o1.coursename,o2.coursename);
}
});
Collections.sort(choose.aclass, new Comparator<Class>() {
@Override
public int compare(Class o1, Class o2) {
return o1.classnumber-o2.classnumber;
}
});
在Score、ExamScore、AssessmentScore放入计算最终成绩的方法。Course类加一个有参构造,可以识别课程的类型是选修还是必修,然后再对应相应的成绩是ExamScore还是AssessmentScore,此类中还由计算课程平时分的均分、期末均分、最终成绩均分。Student类放入收集学生课程的成绩的ArrayLIst,再放入相应的添加进ArryaList的方法。Class类放入一个收集学生的学号和姓名的ArrayList。Choose类放入收集每个班级的信息的ArrayList。CourseList存入全部课程的信息。
OOP9训练题集总结
第一题:统计Java程序中关键词的出现次数
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
本题总结:本题用了HashMap和Map来存取建的对象,先用字符串数组来存取全部的关键字,然后输入文本
先用正则表达式识别//,如果有//,就用//把这段文本分隔并分别放入字符串数组str1,并只取前半部分,然后再输入。
while(!str.equals("exit")) {
if(str.matches("(.*)//(.*)")) {String str1[]=str.split("//");
str2.append(str1[0]+" ");
}
else {str2.append(str+" ");
}
str=input.nextLine();
}
再对一些符号进行识别然后用空格替换
String str3=str2.toString();
Pattern n=Pattern.compile("\"(.*?)\"");
Matcher m=n.matcher(str3);
while(m.find()){
str3=str3.replace(m.group()," ");
n=Pattern.compile("\"(.*?)\"");
m=n.matcher(str3);
}
n=Pattern.compile("/\\**(.*?)/");
m=n.matcher(str3);
while(m.find()){
str3=str3.replace(m.group()," ");
m=n.matcher(str3);
}
if(str3.isEmpty()) {
System.out.println("Wrong Format");
System.exit(0);
}
然后再继续替换一些符号
str3=str3.replace("+","a");
str3=str3.replace(">","a");
str3=str3.replace("=","a");
str3=str3.replace("!","a");
str3=str3.replace(":","a");
str3=str3.replace("["," ");
str3=str3.replace("]"," ");
str3=str3.replace("-","a");
str3=str3.replace("*","a");
str3=str3.replace("/","a");
str3=str3.replace("\\","a");
str3= str3.replaceAll("[^a-zA-Z]", " ");
String []s1=str3.split("[ ' ']");
然后进行关键词匹配,如果匹配将其放入map里面
for(int i=0;i<s1.length;i++) {
for(int j=0;j<keywords.length;j++)
if(s1[i].equals(keywords[j])) {
map.put(keywords[j], 0);
}
}
for( int i = 0;i<s1.length;i++) {
for(int j=0;j<keywords.length;j++)
if(s1[i].equals(keywords[j])) {
count=map.get(keywords[j]);
map.put(keywords[j], count+1);
}
}
再对提取的关键词进行排序然后输出
Set set=map.keySet();
Object[] arr=set.toArray();
Arrays.sort(arr);
for(Object k:arr){
System.out.println(map.get(k)+"\t"+k);
}
OOP10训练题集总结
第一题:容器-HashMap-检索
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
使用HashMap存储学生信息,并实现根据学号的检索功能
本题总结:本题主要是用hashmap去存取键和键对象,先定义一个HashMap,然后输入,再将输入的一行用空格分隔,再分别放入字符串数组array中,如果字符串数组长度为3,将学生的姓名和成绩合为一个字符串str2,再分别把学号和str2放入以学号为键的hashmap。再输入要查找的学号,如果hashmap中containskey就输出学号和键对象,如果没有就输出The student "+num+" does not exist。 第二题: 容器-HashMap-排序
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用HashMap存储学生信息。
本题总结:本题主要是用treemap去进行降序排序
TreeMap<Integer, String> treeMap = new TreeMap<>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
然后后面步骤和题目一大致相同,最后输出有点不一样
for(Map.Entry<Integer, String> entrySet : treeMap.entrySet()){
System.out.println(entrySet.getKey() + " " + entrySet.getValue());
}
第四题:动物发声模拟器(多态)
设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩
其中,在AnimalShoutTestMain类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗和山羊对象的叫声。
本题总结:本题主要考察多态,创建了Dog、Cat、Goat和Animal抽象类以及Main类。
抽象类Ainmal放两个抽象方法abstract String getAnimalClass()、abstract void shout()
然后在其子类Dog、Cat、Goat类中复写方法String getAinmalClass()、void shout()。
在Main类中写出静态方法speak(Animal animal),然后分别newCat、Dog、Goat的对象,再分别把他们三个的对象当作speak方法的参数。
第三题:课程成绩统计程序-2
本题总结:本题相较于oop8的成绩统计程序-1,本题增加了实验课,且实验课的成绩必须为实验,
实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩,实验次数至少4次,不超过9次。
在成绩统计程序-1的基础上我加了一个ExperimentScore类,为Score的子类。在Main类里,在识别字符串长度时加入一个长度大于5和第4个数字是否为4-9的数字的判断,如果大于5并且满足低个数字为4-9,说明是学生的实验成绩,然后对其判断是否为合法输入,如果是分别将学生的信息和考试成绩信息放入相应的ArrayList里面,
if(array.length>5){
if(array[3].matches("^[4-9]")) {
Score score = new AssessmentScore();
number = Integer.parseInt(array[0]);
name = array[1];
course1 = array[2];
number1 = Integer.parseInt(array[3]);
classnumber = number / 100;
choose.addclass(classnumber);
if (!array[0].matches("[0-9]{8}") || name.length() > 10 || course1.length() > 10) {
System.out.println("wrong format");
} else {
choose.addclass(classnumber);
for (int i = 0; i < choose.aclass.size(); i++) {
if (choose.aclass.get(i).getClassnumber() == classnumber) {
choose.aclass.get(i).addstudent(number, name);
for (int j = 4; j < array.length; j++) {
score.addExperimentscorelist(Integer.parseInt(array[j]));
}
choose.aclass.get(i).student1.get(choose.aclass.get(i).student1.size() - 1).addstudentcourse(courselist, course1, number1, score);
break;
}
}
}
}
else System.out.println("wrong format");
}
在Student类里面加一个加入实验成绩到ArrayList的方法,这样就能录入实验的成绩了。
public void addstudentcourse(CourseList courselist, String name,int number,Score experimentscorelist) {
Score score1=new ExperimentScore();
int i = 0;
int flag=0;
for (Course course : courselist.courselist) {
if (course.getCoursename().equals(name)) {
for (int j = 0; j < course1.size(); j++) {
if (course1.get(j).getCoursename().equals(name)) {
flag = 1;
}
}
if (flag == 0) {
if (course.examsort.equals("考察")) {
System.out.println(getNumber() + " " + getName() + " : access mode mismatch");
} else {
Course course2 = new Course(course.coursename, course.sort, course.examsort);
course2.score.setExperimentallscore(experimentscorelist.getExperimentallscore());
for(int m:experimentscorelist.experimentscorelist){
course2.score.experimentscorelist.add(m);
}
course1.add(course2);
courselist.courselist.get(i).coursescore += experimentscorelist.getExperimentallscore();
courselist.courselist.get(i).cnt++;
}
}
}
i++;
}
在Course类里面加入sort是否为实验的判断,如果是就为ExperimentScore.
public Course(String coursename, String sort, String examsort) {
this.coursename = coursename;
this.sort = sort;
this.examsort = examsort;
if (sort.equals("必修")) {
this.score = new ExamScore();
}
if (sort.equals("选修")) {
if (examsort.equals("考察")) {
this.score = new AssessmentScore();
} else {
this.score = new ExamScore();
}
}
if(sort.equals("实验")){
this.score=new ExperimentScore();
}
}
在Score类里加一个ArrayList来放置实验的成绩,加一个加入这个ArrayList的方法,加一个计算实验的成绩的方法。
public int getExperimentallscore(){
int sum=0;
for(int i=0;i<experimentscorelist.size();i++){
sum+=experimentscorelist.get(i);
}
experimentallscore=sum/experimentscorelist.size();
return experimentallscore;
}
OOP9训练题集总结
第一题:容器-ArrayList-排序
输入多个学生的成绩信息,包括:学号、姓名、数学成绩、物理成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用ArrayList存储学生信息。
本题总结:本题有两个类:Student、Main类,在Student类中有私有属性学号number、姓名name、成绩total,然后写出Student类的有参和无参构造,再分别写它们三个的setter和getter方法。在Main类里面先定义一个Student的ArrayList,再输入,然后再一行一行的识别,每一行中以空格分隔,算出成绩总分sum,再将学号、姓名、总分放入Student的有参构造里面,再将student中的值set,将Student的对象student放入ArrayList中
String []array=str.split(" ");
number=Integer.parseInt(array[0]);
name=array[1];
sum=Integer.parseInt(array[2])+Integer.parseInt(array[3]);
Student student=new Student(number,name,sum);
student.setNumber(number);
student.setName(name);
student.setTotal(sum);
list.add(student);
再用Collections.sort进行排序
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getTotal()- o1.getTotal();
}
});
最后输出
第二题:课程成绩统计程序-3
本题由于时间原因未能全部写出,但在假期里再会研究这题。
第三踢:jmu-Java-02基本语法-03-身份证排序
- 输入n,然后连续输入n个身份证号。
- 然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出
exit
并退出。
输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。
输入sort2,将所有身份证按照里面的年月日升序输出。
注意:处理输入的时候,全部使用Scanner
的nextLine()
方法,以免出错。
本题总结:本题首先是输入,然后再创建两个字符串数组sfz、sr,然后再依次输入到sfz中,再识别输入的是sort1还是sort2还是e,如果是e就输出exit结束循环,如果为sort1,将sfz中的部分用substring提取出来,然后就以题目给定的形式放到sr中,再用Arrays.sort进行排序,再依次输出。如果是sort2,将sfz的部分用substring提取出来放入sr,再用Arrays.sort进行排序,最后输出。
String str=in.nextLine();
if(str.equals("e")){
System.out.println("exit");
break;
}else if(str.equals("sort1")){
for(int i=0;i<n;i++){
sr[i]=sfz[i].substring(6,10)+'-'+sfz[i].substring(10,12)+'-'+sfz[i].substring(12,14);
}
Arrays.sort(sr);
for (int i=0;i<n;i++){
System.out.println(sr[i]);
}
}else if(str.equals("sort2")){
for(int i=0;i<n;i++){
sr[i]=sfz[i].substring(6,14);
}
Arrays.sort(sr);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(sfz[j].contains(sr[i])){
System.out.println(sfz[j]);
break;
}
第五题: jmu-Java-03面向对象基础-05-覆盖
1. 新建PersonOverride类
a. 属性:String name
、int age
、boolean gender
,所有的变量必须为私有(private)。
b. 有参构造方法,参数为name, age, gender
c. 无参构造方法,使用this(name, age,gender)
调用有参构造方法。参数值分别为"default",1,true
d.toString()
方法返回格式为:name-age-gender
e. equals
方法需比较name、age、gender,这三者内容都相同,才返回true
.
2. main方法
2.1 输入n1,使用无参构造方法创建n1个对象,放入数组persons1。
2.2 输入n2,然后指定name age gender
。每创建一个对象都使用equals方法比较该对象是否已经在数组中存在,如果不存在,才将该对象放入数组persons2。
2.3 输出persons1数组中的所有对象
2.4 输出persons2数组中的所有对象
2.5 输出persons2中实际包含的对象的数量
2.5 使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));
输出PersonOverride的所有构造方法。
提示:使用ArrayList
代替数组大幅复简化代码,请尝试重构你的代码。
本题总结:本题有两个类Main、PersonOverride类,在PersonOverride类里面加入有参构造和无参构造,其中无参构造调用有参构造
public PersonOverride() {
this("default", 1, true);
}
然后复写方法String toString()和boolean equals()
public String toString() {
return name + "-" + age + "-" + gender;
}
public boolean equals(PersonOverride personOverride) {
if (personOverride.name.equals(this.name)) {
if (personOverride.age == this.age) {
if (personOverride.gender == this.gender) {
return true;
}else return false;
}return false;
}
return false;
}
在Main类里面,先输入,然后再创立PersonOverride属性的ArrayList--person1s、person2s,在person1s中加入无参构造,在person2s中加入有参构造,然后判断是否有相等的,如果有就不添加,最后输出。
三、踩坑心得
在写课程成绩统计程序-1时,因为一开始没有构思好,所以少创建了几个ArrayList,有些还少加了ArrayList的add方法。在这题中对一些非法输入和错误输入的判断,开始了解的不够,导致后面有些错误样例没过。一开始也并不知道怎样去对数据进行排序,通过后面的学习才知道,要用Collections.sort的方法,在课程成绩统计-2中也用了这样的排序,2中加了一个实验课,一开始不知道怎样去识别实验课成绩那一行,后面通过观察字符串长度大于5等一些条件可以识别出。在HashMap排序中,最后输出,我以为treemap的输出和hashmap一样,但并非如此,我通过查资料,把treemap.entrySet遍历赋值给Map.Entry<Integer,String>entrySet,再输出entrySet.getkry、entrySet.getValue。
四、改进建议
在写这种类关系比较复杂或者有多个类的题目时,应该先多分析类与类的关系。要分清楚Map、HashMap、TreeMap的用法以及相应的语法,不能弄混。在用Collections.sort进行排序时一定要注意是顺序还是逆序。用substring方法是,不要弄错目标对应的序号,要减一位。 五、总结 这几次oop训练集较前几次来说,会较为复杂一点,在课程成绩统计中,要求熟练了解与运用类与类之间的关系以及多态的运用。后面的oop题集中考察了Map、HashMap、TreeMap的用法以及相应的语法,然后还考察了ArrayList的排序以及自定义接口ArrayIntegerStack,还有Collection.sort的用法,对于课程成绩统计-3的那个题,对我来说,可能有点难度,时间上的条件也不是很好,所以这个题尽我所能了还没有做完,但在之后的假期中,我会投入更多的精力去解决。这次内容较多,知识点也较难一点,需要及时巩固与复习,在后面的假期中也会去继续去了解和学习java的知识点。 标签:sort,第三阶段,题目,name,str3,pta,int,array,成绩 From: https://www.cnblogs.com/xk159753963w/p/17509570.html