这篇继续来学习一个关于TreeSet集合编程题的分析过程和代码实现过程。这个题目还是比较复杂的,涉及到OOP,键盘输入和集合排序等。编程的题目是:输入5个学生信息,格式为(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低排序输出。
1.分析
看题目,我们第一个看到的是学生信息,那么是不是需要写一个学生类,然后看到需要键盘输入,但是输入格式是一组,所以这里还需要字符串切割,根据逗号切割。切割出来数字符串数组,所以需要把成绩的字符串类型转换成Int类型。看到总分排序,所以我们需要Set集合,这里我们使用TreeSet集合。总分比较,说明TreeSet集合传入参数是一个比较器,比较的是总分成绩。大致,我们可以按照以下步骤去划分这个题目成不同的小任务去实现。
1)定义一个Student类
成员变量:姓名,语文成绩,数学成绩,英语成绩,总分成绩
成员方法:空参,有参构造,有参构造的参数分别是姓名,语文成绩,数学成绩,英语成绩
toString方法,需要重写,遍历学生类打印不是内存地址,而是属性的值。
2)创建键盘录入对象,需要导入Scanner类
3)创建TreeSet集合对象,传入参数是比较器,总分比较
4)录入5个学生信息,集合的size就是等于5,超过不继续存储
5)录入字符串切割,逗号切割,返回是一个字符串数组,需要把成绩字符串转成Int类型
6)转换后结果封装到学生类对象里,然把学生类对象添加到TreeSet集合中
7)遍历TreeSet集合,打印学生信息
2.代码实现过程
根据上分析步骤,我们尝试去完成一部分代码,先完成那些简单,自己能够完成的。然后对照下面的代码,参考写出自己的代码。
学生类Student.java 代码如下。
package bean;
public class Student {
private String name;
private int yuWenScore;
private int mathScore;
private int englishScore;
private int totalScore;
public Student() {
super();
}
public Student(String name, int yuWenScore, int mathScore, int englishScore) {
super();
this.name = name;
this.yuWenScore = yuWenScore;
this.mathScore = mathScore;
this.englishScore = englishScore;
this.totalScore = this.yuWenScore + this.mathScore + this.englishScore;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYuWenScore() {
return yuWenScore;
}
public void setYuWenScore(int yuWenScore) {
this.yuWenScore = yuWenScore;
}
public int getMathScore() {
return mathScore;
}
public void setMathScore(int mathScore) {
this.mathScore = mathScore;
}
public int getEnglishScore() {
return englishScore;
}
public void setEnglishScore(int englishScore) {
this.englishScore = englishScore;
}
public String toString() {
return name + ","+ yuWenScore + ","+mathScore + ","+englishScore + ","+ totalScore;
}
public int getTotalScore() {
return totalScore;
}
}
测试类,代码
package treeset;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
import bean.Student;
public class Test1_TreeSet {
public static void main(String[] args) {
//2.创建Sacnner对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生成绩,格式是:姓名,语文成绩,数学成绩,英语成绩");
//3.创建treeset集合
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//降序
int num = s2.getTotalScore() - s1.getTotalScore();
return num == 0? 1 : num; //总分成绩相同的也需要存入集合
}
});
//4.录入5个学生成绩信息,开始循环
while(ts.size() < 5) {
//5. 切割字符串
String line = sc.nextLine();
//切割并存入数组
String[] arr = line.split(",");
//转换成Int
int chinese = Integer.parseInt(arr[1]);
int math = Integer.parseInt(arr[2]);
int english = Integer.parseInt(arr[3]);
//6.转换后结果封装到学生类对象里,然把学生类对象添加到TreeSet集合中
ts.add(new Student(arr[0],chinese, math, english));
}
//7.遍历TreeSet集合,打印学生信息
System.out.println("排序后的学生信息");
for (Student student : ts) {
System.out.println(student);
}
}
}
控制台测试结果:
请输入学生成绩,格式是:姓名,语文成绩,数学成绩,英语成绩
zhangsan,50,60,89
lisi,77,88,99
wanger,55,99,100
liuliu,88,100,100
zhouqi,88,99,94
排序后的学生信息
liuliu,88,100,100,288
zhouqi,88,99,94,281
lisi,77,88,99,264
wanger,55,99,100,254
zhangsan,50,60,89,199
这里需要注意下逗号,如果代码中切割采用是英文输入法的逗号,输入成绩的时候逗号也需要写英文,否则切割之后不是你想要的数组,可能报索引越界异常错误。