package com.itheima;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Test1 {
public static void main(String[] args) throws IOException {
/**
* 1、有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,
* 输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。
* 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
*/
/*思路:
* 定义学生类Student,并实现Comparable接口,用于学生的比较;复写hashCode 和 equals方法,用于将学生对象存入双列集合的键值比较
*
* 定义双列集合:存入学生对象,在遍历的过程中写入到指定的文件夹中
*/
Comparator<Student> com = Collections.reverseOrder();//自定义一个比较器
/* static <T> Comparator<T>
reverseOrder()
返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。*/
File fi = new File("E:\\stu.txt");//指定存储的目录
Set<Student> se = StudentIn(com,false);
ToFile(se,fi);
}
//对于集合进行遍历,获取对象元素.并输出到指定文件.
public static void ToFile(Set<Student> se,File fi) throws IOException{
Iterator<Student> it = se.iterator();
FileWriter fw = new FileWriter(fi);
while(it.hasNext()){
Student s = it.next();
fw.write(s.toString()+s.getSum()+"\t"+"\r\n");//加入制表符和回车
}
fw.close();
}
//定义键盘录入学生信息的方法,存入集合中
//并传入比较器以及排序需求.如果是true,就是默认排序,否则就是自定义的排序
public static Set<Student> StudentIn(Comparator<Student> com,boolean bo){
Scanner scan = new Scanner(System.in);
Set<Student> se = null;
if(bo == true){//自然排序
se = new TreeSet<Student>();
}
else{//自定义排序(也就是自定义的倒序,总分从高到底)
se = new TreeSet<Student>(com);
}
while(true){
String ss = scan.nextLine();
if(ss.equals("over")){//输入命令结束
System.out.println("录入学生信息结束。");
break;
}
else{//切割,并将字符串和角标传递给student对象,并存入集合中.
String[] str = ss.split(",");
se.add(new Student(str[0]
,Double.parseDouble(str[1])
,Double.parseDouble(str[2])
,Double.parseDouble(str[3])));
}
}
return se;
}
}
//定义学生类,因为要比较排序,故实现Comparable接口,并使用泛型,提高安全性(只能传入学生对象)
class Student implements Comparable<Student>{
//定义学生对象的属性
//全部私有,然后对外提供访问的方法
private String name;
private Double ch;
private Double ma;
private Double en;
private Double sum;
//创建带参的构造方法,其中总成绩是求和得来的
public Student(String name, Double ch, Double ma, Double en) {
this.name = name;
this.ch = ch;
this.ma = ma;
this.en = en;
this.sum = ch+ma+en;
}
//通过实现Comparable接口,复写compareTo方法,比较各个学生的总成绩,如果成绩相同,则根据姓名排序
public int compareTo(Student stu){
// int i = new Double(this.sum).compareTo(new Double(stu.sum));==========================原文是这么写的,我使用下方代码,替换
int compareTo = this.sum.compareTo(stu.sum);
if(compareTo==0)
return this.name.compareTo(stu.name);
return compareTo;
}
//复写hashCode() 和 equals() 方法,来对各个学生对象进行去重
public int hashCode(){
return (int)(this.name.hashCode()+this.sum*66);
}
public boolean equals(Student stu){
return this.name.equals(stu.name)&&this.sum==stu.sum;
}
//对外提供访问属性的set() 和 get() 方法 注意:总分是计算得来的,只对外提供get() 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getCh() {
return ch;
}
public void setCh(Double ch) {
this.ch = ch;
}
public Double getMa() {
return ma;
}
public void setMa(Double ma) {
this.ma = ma;
}
public Double getEn() {
return en;
}
public void setEn(Double en) {
this.en = en;
}
public Double getSum(){
return sum;
}
//复写toString() 方法
@Override
public String toString() {
return "Student [name=" + name + ", ch=" + ch + ", ma=" + ma + ", en="
+ en + "]";
}
} |
|