1.案例实现
键盘录入学生的信息,吧数据存储到txt文件里面
然后我们在吧txt文件里面的数据读取出来 ,转变为学生对象,添加到treeset集合,treeset集合吧集合里面的元素按照总成绩进行排序存储。
这里我主要想讲解一下 TreeSet集合
2.集合结构
集合相比于数组就是集合的长度是不固定的,不用提前设置集合的长度,集合的结构如下
比较常使用的就是ArrayList,TreeSet,HashMap
TreeSet的元素不重复,并且可以实现比较器排序,可以按照自己定义的方法进行排序,或者进行自然排序
HashMap结合是按照键值对存储数据的,我们在遍历的时候有几种方法
1.获得集合的键的集合,根据键的集合去获得值,进行遍历
2.获得集合的键值对对象的集合,然后在分别得到键和值进行遍历
3.TreeSet比较器排序讲解
Treeset的构造方法
TreeSet(){} //按照自然排序
TreeSet(Comparator compartor){} // 自定义比较器进行排序
自定义比较器的时候因为参数是一个接口我们要使用接口的具体实现类,这里使用了匿名内部类
//创建集合存储从文件里面读出来的数据 并且为他设置比较器
TreeSet<Student> treeSet =new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//前减后 小到大
//注意主要条件和次要条件
//先按照总分排序
int res1 = s2.getSum()-s1.getSum();
//若总分相同 再按照语文分数比较
int res2 = res1 == 0 ? s2.getChinese()-s1.getChinese() : res1;
//若总分相同 语文成绩相同 再按照数学分数比较
int res3 = res2==0? s2.getMath()- s1.getMath() : res2;
//若总分相同 语文成绩相同 数学相同 再按照英语分数比较
int res4 = res3==0 ? s2.getEnglish()- s2.getEnglish() : res3;
//如果语数外成绩全都一样 按照姓名首字母 从a-z排序
int res5 = res4==0? s1.getName().compareTo(s2.getName()) : res4;
return res5;
}
});
代码里面
public int compare(Student s1, Student s2),student就是学生对象,
前减后 对于int数据实现从小到大的添加到结合 对于String实现从a-z 添加到集合
后减前 对于int数据实现从大到小的添加到结合 对于String实现从z-a 添加到集合
//当我们最后一个数据添加到集合里面的时候,集合就已经排序完成了,
需要注意的是比较器比较String类型的数据时的方法
//如果语数外成绩全都一样 按照姓名首字母 从a-z排序
int res5 = res4==0? s1.getName().compareTo(s2.getName()) : res4;
4.项目完整代码:
学生类对象**
package package03_getFiletoStudentAndPaiXu;
public class Student {
private String name ;
private int chinese ;
private int math;
private int english;
private int sum;
public Student() {
}
public Student(String name, int chinese, int math, int english) {
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
public int getSum() {
return sum = chinese+english+math;
}
}
main程序
package package03_getFiletoStudentAndPaiXu;
import java.io.*;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class demo1 {
/*
实现键盘录入5个学生的信息
把这些信息格式化以后 存储到文件里面
然后吧文件里面的数据转化为学生对象
这些学生对象存储到集合里面去
要求输出集合的时候按照学生的总分从高到低进行排序
因为要对几个进行排序 所以就使用Treeset集合使用比较器排序
*/
public static void main(String[] args) throws IOException {
//创建字符输入流
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\IdeaProjects\\Day07\\a.txt");
//字符输出缓冲流
BufferedWriter bw = new BufferedWriter(fw);
//键盘录入数据
System.out.println("你想录入几个同学的信息?");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//开始录入学生信息
Scanner sc_data = new Scanner(System.in);
for (int i = 0 ; i< num ;i++){
System.out.println("请输入第"+(i+1)+"个学生的信息");
System.out.println("姓名");
String name = sc_data.nextLine();
System.out.println("语文成绩");
String chinese = sc_data.nextLine();
System.out.println("数学成绩");
String math =sc_data.nextLine();
System.out.println("英语成绩");
String english = sc_data.nextLine();
String s = name+","+chinese+","+math+","+english;
System.out.println(s);
//存储进文件 一行一行的存储
bw.write(s);
//换行
bw.newLine();
//刷新
bw.flush();
}
//存储结束 释放资源
bw.close();
//开始从文件里面读数据
FileReader fr = new FileReader("C:\\Users\\Administrator\\IdeaProjects\\Day07\\a.txt");
BufferedReader br = new BufferedReader(fr);
//创建集合存储从文件里面读出来的数据 并且为他设置比较器
TreeSet<Student> treeSet =new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//前减后 小到大
//注意主要条件和次要条件
//先按照总分排序
int res1 = s2.getSum()-s1.getSum();
//若总分相同 再按照语文分数比较
int res2 = res1 == 0 ? s2.getChinese()-s1.getChinese() : res1;
//若总分相同 语文成绩相同 再按照数学分数比较
int res3 = res2==0? s2.getMath()- s1.getMath() : res2;
//若总分相同 语文成绩相同 数学相同 再按照英语分数比较
int res4 = res3==0 ? s2.getEnglish()- s2.getEnglish() : res3;
//如果语数外成绩全都一样 按照姓名首字母 从a-z排序
int res5 = res4==0? s1.getName().compareTo(s2.getName()) : res4;
return res5;
}
});
String dataFromFile ;
while ((dataFromFile = br.readLine()) != null){
//开始对数据进行分割
String split_res[] = dataFromFile.split(",");
//获得每一个数据
String name = split_res[0];
int chinese = Integer.parseInt(split_res[1]);
int math = Integer.parseInt(split_res[2]);
int english = Integer.parseInt(split_res[3]);
//创建学生对象
Student student = new Student(name,chinese,math,english);
//添加到集合
treeSet.add(student);
}
//开始遍历集合
for (Student student : treeSet){
System.out.println(student.getName()+"--"+student.getChinese()+"--"
+student.getMath()+"--"+student.getEnglish()+"--"+student.getSum());
}
}
}