这道题后来在一本书上找到了相关的解法,不知道有没有跟我有同样的问题的朋友,在这里记录下。
package io;
//一个IO的完整实例1
/*
* 要求计算Java成绩的平均分数,打印输出不及格的学生名字以及
* 按照Java成绩的排序输出清单(降序输出)
* */
public class Student implements java.io.Serializable,Comparable{
private String id,name,email;
private int java,age;
private boolean gender;
//构造方法1
public Student(){
}
//构造方法2
public Student(String id, String name, String email, int java, int age,
boolean gender) {
// super();
this.id = id;
this.name = name;
this.email = email;
this.java = java;
this.age = age;
this.gender = gender;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public int hashCode() {//实现散列方法
return id.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if(obj instanceof Student){ //如果学号相等就认为对象相等
return id.equals(((Student)obj).id);//并没有比较全部的属性数据
}
return false;
}
@Override
public int compareTo(Object o) {//提供对象的比较方法
Student s=(Student)o;
return s.java-this.java;
/*
* 注意:不是this.java-s.java
* 因为需要按照java成绩降序输出成绩单
* */
}
public String toString(){
return "Student{"+"id="+id+",name="+name+",email="+email+",java="
+java+",age"+age+",gender="+gender+"}";
}
}
package io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.StringTokenizer;
//一个IO的完整实例2
public class TextDataLoader {
//从文本文件中加载数据,返回一个List集合
public ArrayList<Student>load(){
//创建一个空的集合
ArrayList<Student>r=new ArrayList<Student>();
try {
//以字节流的形式读入
/*
* 因为是用字节流来写媒介,所以对应的是OutputStream
*
* */
FileInputStream fis=new FileInputStream("d:/a.txt");
//将字节流按照指定编码转换为字符流
InputStreamReader isr=new InputStreamReader(fis,"GBK");
//该类提供缓存字符流功能,同时将会过滤掉回车和换行符,提供行数据读入
BufferedReader br=new BufferedReader(isr);
String s="";
while((s=br.readLine())!=null){
s=s.trim();
//如果行数据是空,则继续读下一行
if(s.length()==0)continue;
//字符串分割器类
StringTokenizer st=new StringTokenizer(s,",");
//分隔为数据项集合
String id=st.nextToken().trim();
String name=st.nextToken().trim();
String email=st.nextToken().trim();
int age=Integer.parseInt(st.nextToken().trim());
int java=Integer.parseInt(st.nextToken().trim());
boolean gender=st.nextToken().trim().equals("男");
/*调用String类的spilt方法也可以实现
String[] sa=s.split(",");
String id1=sa[0].trim();
String name1=sa[1].trim();
String eamil=sa[2].trim();
int age1=Integer.parseInt(sa[3].trim());
boolean gender1=sa[5].trim().equals("男");
*/
Student stu=new Student(id, name, email, java, age, gender);
r.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
}
return r;
}
public static void main(String[] args) {
TextDataLoader dll=new TextDataLoader();
ArrayList<Student>list=dll.load();//加载数据文件内容到集合list
int sum=0;//累加成绩
for (int i = 0; i < list.size(); i++) {
Student s=list.get(i);
sum+=s.getJava();
if (s.getJava()<60) {
System.out.println(s.getName()+"failed.");
}
}
System.out.println("average="+1.0*sum/list.size());//输出平均成绩
Collections.sort(list);//排序集合
for (int i = 0; i < list.size(); i++) {//按照成绩降序输出成绩单
Student s=list.get(i);
System.out.println(s.getId()+"\t\t\t"+s.getName()+"\t\t\t"+s.getJava());
}
}
}
这里放上D盘下a.txt的内容
001,张三,zs@163.com,20,60,男
002,李四,ls@163.com,16,85,女
007,王丽,wl@gamil.com,18,55,女
008,小白,xb@sina.com,17,89,男
006,熊猫,xm@sina.com,22,90,女
以及在Console里的输出结果
王丽failed.
average=75.8
006 熊猫 90
008 小白 89
002 李四 85
001 张三 60
007 王丽 55
具体的参考注释应该就很清楚啦,希望我能够彻底掌握它~
|