JAVA读取文件 排序 写出文件

读取TXT文件的格式为:字母 数字
如: TOM 100
JACK 200
BILL 50
CATHY 150

然后按照数字大小排序(由大到小)
输出TXT文件格式为:
JACK 200
CATHY 150
TOM 100
BILL 50
最后一行输出平均值=总和/人数
如:平均值=(200+150+100+50)/4=125

输出为一个新生成的TXT文件,不改变原文件
如读取文件为test.txt, 输出文件为text1.txt

我特意写的规范了一些
楼主看一下希望有帮助吧
12楼写的太混乱了 3楼和我这个异曲同工吧
我建了Sutdent的类和对象 用接口进行了排序 这样方便一点感觉 最好不要用一对字符串当处理的对象 很混乱 组织成对象好些
如果不是遍历 是取出某有个特定下标的值 数组最好不要用数字 用有特殊意义的常量
这样可读性更强些
文件每行是一个记录的 用BufferReader和Writer最恰当 因为有readLine和writeLine方法
用集合类进行管理感觉对这种问题比较合适
这样复用性强一些感觉
还有可以改进的地方 感觉用串行化更好 但要是非输出文本 就这样吧

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Manager {

private BufferedReader input;
private BufferedWriter output;
private ArrayList<Student> students;//存放所有的学生对象的List

//读入文件
public void read() {
students = new ArrayList<Student>();
try {
this.input = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\2.txt"));
String s = new String();
while ((s = input.readLine()) != null) {
String[] nameAndScore = s.split(" ");
this.students.add(new Student(nameAndScore[Student.NAME],
Integer.parseInt(nameAndScore[Student.SCORE])));
}
this.sort();//按分数将学生排序
this.input.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}

//写回文件
public void write() {
try {
this.output = new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\3.txt"));
for (Student s : this.students) {
output.write(s.toString(), 0, s.toString().length());
output.newLine();
}
this.output.write(String.valueOf(this.average()), 0, String.valueOf(this.average()).length());//写入平均值
this.output.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}

//排序
private void sort() {
Collections.sort(this.students, new Comparator<Student>() {

public int compare(Student o1, Student o2) {
return o2.getScore() - o1.getScore();
}
});
}

//求平均值
public float average() {
float average = (float) 0;
for (Student s : this.students) {
average += s.getScore();
}
return average / (this.students.size());
}

public static void main(String[] args) {
Manager m = new Manager();
m.read();
m.write();

}
}

//Student类
class Student {

private String name;
private int score;
public static int NAME = 0;
public static int SCORE = 1;

public Student(String name, int score) {
this.name = name;
this.score = score;
}

public int getScore() {
return score;
}

@Override
public String toString() {
return name + " " + score;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-25
用IO里面的类来读取文件,把读取出来的文件一行一行的放进list,然后遍历出来,把字符串按照一定的要求去拆分,然后排序.就OK了
第2个回答  2011-01-25
你按行读取文件
然后用spriXX什么的分割字符串。 吧后面的转换为数字
拿个数做sum。后面的循环相加。
前面的字符串 和数字放到一起 放到list里面然后循环排序。。怎么排你自己写了
最后添加你最后的那个字符串。
用stringBuffer ..
第3个回答  2011-01-25
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class TestFileOutPutString {
public static void main(String[] args) throws FileNotFoundException {

FileReader in = new FileReader("d:/test.txt");//写你文件路径
BufferedReader input = new BufferedReader(in);
String s=null;
int sum=0;
ArrayList ss=new ArrayList();
try {
while((s=input.readLine())!=null){
ss.add(s);
sum=sum+Integer.parseInt(s.split(" ")[1]);
}
in.close();
} catch (FileNotFoundException e2) {
System.out.println("找不到指定文件"); System.exit(-1);
} catch (IOException e1) {
System.out.println("错误"); System.exit(-1);
}
Comparator comparator = new Comparator(){
public int compare(Object o1, Object o2){
String b1=(String)o1;
String b2=(String)o2;
return Integer.parseInt(b1.split(" ")[1])-Integer.parseInt(b2.split(" ")[1]);
}
};

Collections.sort(ss,comparator);
Collections.reverse(ss);
for(int i=0;i<ss.size();i++){
System.out.println(ss.get(i));
}
System.out.println("平均值="+sum/4.0);

}
}
文件格式 JACK 200 ,JACK和200之间要空一格
第4个回答  2011-01-25
FileInputStream fis=new FileInputStream("aaa.txt");
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
String des=null;
List<String> l=new ArrayList<String>();
while((des=br.readLine())!=null)
{
l.add(des.trim());
}
System.out.println(l);
StringBuffer sb=new StringBuffer();
for(int i=0;i<l.size();i++){
for (int j = i; j <l.size(); j++) {
String d=l.get(i);
int m=Integer.parseInt(d.substring(d.indexOf(" ")).trim());//取出数字
String d2=l.get(j);
int n=Integer.parseInt(d2.substring(d2.indexOf(" ")).trim());//取出数字
String temp="";
if(m<n){
temp=l.get(i);
l.set(i, l.get(j));
l.set(j, temp);
}

}

}

//将排序好的数据重新写回文件
PrintWriter pw=new PrintWriter("aaa.txt");
for (String string : l) {
pw.println(string);
}
pw.flush();
pw.close();
System.out.println("结束");

把上面的代码加入main方法运行就o了,记得给分哟
相似回答