雨后添情 发表于 2009-2-24 10:37:54

Java中数字字符串排序

老师布置的一个作业要用到把文件中的各条记录按照记录中的一个字段排序,这个字段是数字字符串。本打算把字符串转成数字,再用学过的一些排序算法实现,可一想,如此强大的java,这种小小功能应该不用这么复杂的自己折腾。仔细读过书后,发现果真有捷径可走。

    我的思路是这样的

1.把字符串读入ArrayList,每个字符串是一项;

2.把ArrayList对象传入Collection.sort();

3.大功告成,ArrayList中的字符串已经排好序了。

    有几点要注意,构造ArrayList对象时,要声明类型,因为ArrayList是基于泛型实现的。如ArrayList<String> lines = new ArrayList<String>()。之所以不用转换成数字可以实现排序,是因为排序是按照ASCII码实现的,数字在ASCII码中就是从小到大排列的。
    还有一点读写文件的知识,读写文件时,使用BufferedInputStream和BufferedOutputStream可以获得比较好的效率。应为这种读文件的方式,自己配有一个缓冲区,可以把磁盘数据缓冲到内存中。另外,读文件的时候使用CharArrayWriter可以很方便的把文件内容转换成字符串,因为文件的read()方法获得int数据(估计是为了保存各种数据方便统一吧),CharArrayWriter的对象可以接受int,利用他的toString()方法,就可以把读入的数据转换成字符串。
    下面我给出我的实现代码,读取的文件名是main函数的参数。
import java.util.*;
import java.io.*;
public class Sort {
private BufferedInputStream in;
private BufferedOutputStream out;

Sort(String inputFile,String outputFile)
{
try{
File srcFile = new File(inputFile);
File desFile = new File(outputFile);
in = new BufferedInputStream(new FileInputStream(srcFile));
out = new BufferedOutputStream(new FileOutputStream(desFile));
}
catch(IOException e){
e.printStackTrace();
}

}

public void sortRecord()
{
try{
ArrayList<String> lines = new ArrayList<String>();//保证ArrayList类型安全
CharArrayWriter writer = new CharArrayWriter();
int c = in.read();
while(c != -1)
{
writer.write(c);
if((char)c == '\n')
{
String line = writer.toString();
lines.add(line);
writer.reset();
}
c = in.read();
}
Collections.sort(lines);
Iterator<String> itr = lines.iterator();

while(itr.hasNext()){
char[] buf = ((String)itr.next()).toCharArray();
for(int i=0;i<buf.length;i)
{
out.write(buf);
}
}
out.flush();//将数据写入文件
out.close();
}
catch(IOException e)
{
e.printStackTrace();
}

}
public static void main(String[] args)
{
Sort record = new Sort(args,args);
record.sortRecord();
}

}
页: [1]
查看完整版本: Java中数字字符串排序