package com.microsoft.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
* 学生类实现比较器
*
* @author liuwang
*/
class Student implements Comparable<Student> {
private String name;
private int math;
private int english;
private int chinese;
private int sum;
Student(String name, int math, int english, int chinese) { // 构造方法
this.name = name;
this.math = math;
this.english = english;
this.chinese = chinese;
this.sum = math + english + chinese;
}
public String getName() {
return name;
}
public int getMath() {
return math;
}
public int getEnglish() {
return english;
}
public int getChinese() {
return chinese;
}
public int getSum() {
return sum;
}
/**
* 重写hashCode方法。现比较两个学生对象的hashCode是否一致。如果一致才会继续比较equals。
*/
public int hashCode() {
return name.hashCode() + sum * 37;
}
/**
* 重写equals方法
*/
public boolean equals(Object obj) {
if (!(obj instanceof Student))
throw new ClassCastException("类型不匹配!");
Student s = (Student) obj;
return this.name.equals(s.name) && this.sum == s.sum;//如果姓名和总分都相同则为同一个人。
}
/**
* 重写toString,指定一个输出格式。
*/
public String toString() {
return "Student[" + name + "," + chinese + "," + math + "," + english
+ "]";
}
/**
* 重写比较器。先比总分,如果相等再比较两个人都姓名。
*/
public int compareTo(Student s) {
int num = new Integer(this.sum).compareTo(s.sum);
if (num == 0) {
return this.name.compareTo(s.name);
}
return num;
}
}
/**
* 学生工具类测试。
*/
public class StudentTool {
/**
* 方式一:默认比较器,总分是从低到高的不符合需求。
*/
public static Set<Student> getStudent() throws IOException {
return getStudent(null);
}
/**
* 方式二:传一个自定义的比较器。
*/
public static Set<Student> getStudent(Comparator<Student> cmp)
throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
Set<Student> stus;
if (cmp == null)
stus = new TreeSet<Student>();
else
stus = new TreeSet<Student>(cmp);
while ((line = bufr.readLine()) != null) {
if (("over").equals(line)) //读到"over"循环终止。
break;
String[] info = line.split(","); //将读到的数据用","切割,装进info字符串数组。
Student stu = new Student(info[0], Integer.parseInt(info[1]),
Integer.parseInt(info[2]), Integer.parseInt(info[3]));//新建学生对象并运用构造函数进行初始化。
stus.add(stu);//将学生对象添加到TreeSet集合当中。
}
bufr.close();//关闭缓冲区。
return stus;//返回学生集合。
}
/**
* 将学生写入文件
*/
public static void writeToFile(Set<Student> stus) throws IOException {
BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));//新建一个文件输入流
for (Student stu : stus) { //循环写入
bufw.write(stu.toString() + "\t");//“\t”制表
bufw.write(stu.getSum() + "");
bufw.newLine();//换行
bufw.flush();//刷新
}
bufw.close();//关闭缓冲区
}
public static void main(String[] args) throws IOException {
Comparator<Student> cmp = Collections.reverseOrder();// 强行逆转默认比较器
writeToFile(getStudent(cmp));
}
}
分享到:
相关推荐
实例185 异步加载并播放声音文件 269 5.3 动画播放 270 实例186 播放Flash动画 270 实例187 制作AVI播放器 272 实例188 播放GIF动画 273 实例189 利用Image制作小动画 274 5.4 媒体控制 275 实例190 检测是否...
实例185 异步加载并播放声音文件 269 5.3 动画播放 270 实例186 播放Flash动画 270 实例187 制作AVI播放器 272 实例188 播放GIF动画 273 实例189 利用Image制作小动画 274 5.4 媒体控制 275 实例190 检测是否...
实例185 异步加载并播放声音文件 269 5.3 动画播放 270 实例186 播放Flash动画 270 实例187 制作AVI播放器 272 实例188 播放GIF动画 273 实例189 利用Image制作小动画 274 5.4 媒体控制 275 实例190 检测是否...
实例185 异步加载并播放声音文件 269 5.3 动画播放 270 实例186 播放Flash动画 270 实例187 制作AVI播放器 272 实例188 播放GIF动画 273 实例189 利用Image制作小动画 274 5.4 媒体控制 275 实例190 检测是否...
103 <br>0167 锁定文本框内的文本 103 <br>0168 使用Message.Show输出用户信息 104 <br>5.3 图片数据处理技巧 104 <br>0169 如何将图片存入数据库 104 <br>0170 如何将图片从数据库中读取...