前两天在JavaEye上看到了篇文章,作者在一家公司面试遇到了这个问题,感觉蛮有意思,自己回头写了下。
自己的接触Java有半年多了,由于是做Web开发的,大部分情况下用Java来操作数据库。对于文件的读写很少
用到,写起来比较生疏,简单的功能用了一个小时,代码写的相当笨拙,在这亮一下,希望大牛们给指点一二
最好给些现成的代码好学习下,将来要不找工作写出这种代码估计很难过关.ps:文件的格式是
XXXX   数字\n
XXXX   数字\n
......要求读出文件中的数据,按数字排序后写回到另一文件package com.saturday;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ReadTxt {
public static void main(String args[]){
try{
List lsRecords=readData("D:/Data.txt");
sortRecord(lsRecords,"asc");
writeData(lsRecords);
}catch(FileNotFoundException ex){
System.out.println("无法读取数据文件!");
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}

public static List readData(String sFilePath) throws Exception{
BufferedReader bufreader=null;
List lsRecords=new ArrayList();

try{
StringBuffer sbData=new StringBuffer();
String sLineData=null;
bufreader=new BufferedReader(new FileReader(sFilePath));
Pattern p=Pattern.compile(
"^\\s*(.*?)\\s+(\\d+)\\s*$",
Pattern.MULTILINE);

while((sLineData=bufreader.readLine())!=null){
sbData.append(sLineData+"\n");
}

Matcher m=p.matcher(sbData);
while(m.find()){
lsRecords.add(m.group(1)+":"+m.group(2));
}
}catch(Exception ex){
throw ex;
}finally{
try{
if(bufreader!=null)
bufreader.close();
}catch(Exception ex){}
}

return lsRecords;
}

public static void sortRecord(List lsRecords,String sSortSty){
Comparator AscCmp=new Comparator(){
public int compare(Object o1,Object o2){
String str1=(String)o1;
String str2=(String)o2;
int int1=Integer.parseInt(
str1.substring(str1.indexOf(':')+1));
int int2=Integer.parseInt(
str2.substring(str2.indexOf(':')+1));

return int1<int2?-1:1;
}
};

Comparator DesCmp=new Comparator(){
public int compare(Object o1,Object o2){
String str1=(String)o1;
String str2=(String)o2;
int int1=Integer.parseInt(
str1.substring(str1.indexOf(':')+1));
int int2=Integer.parseInt(
str2.substring(str2.indexOf(':')+1));

return int1<int2?1:-1;
}
};

if(sSortSty.equals("des"))
Collections.sort(lsRecords,DesCmp);
else
Collections.sort(lsRecords,AscCmp);
}

public static void writeData(List lsRecords) throws Exception{
BufferedWriter bufwriter=null;

try{
bufwriter=new BufferedWriter(new FileWriter("D:/SortedData.txt"));
String sLineData=null;

Iterator i=lsRecords.iterator();
while(i.hasNext()){
sLineData=(String)i.next();
sLineData=sLineData.replaceAll(":", "  ")+"\n";
bufwriter.write(sLineData);
}
}catch(Exception ex){
throw ex;
}finally{
try{
if(bufwriter!=null)
bufwriter.close();
}catch(Exception ex){}
}
}
}

解决方案 »

  1.   

    感觉这个程序些的不错的啊
    不过很有可能OutOfMemory
      

  2.   

    一次性把数据都读出来然后用正则判断确实比较耗内存,但是不这样的话读出的数据就不好保证了,毕竟
    是从没有格式限制的txt文件,不是xml或数据库文件。文件读写这一块做的少比较生疏
      

  3.   

    别的就不说了,就说你的writeData吧,
    Iterator i=lsRecords.iterator();
    使用Iterator 可能回导致你的结果不正确哦,iterator()可能会打乱你的排序
      

  4.   

    改进了下读函数,每读一条验证一次。内存可能会省一些,但速度可能没有原来快了。这个程序还是不能
    读大数据量的文件,把那么多数据都载进来肯定会内存溢出的。不知道大家有什么好办法
    package com.saturday;import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class ReadTxt {
    public static void main(String args[]){
    try{
    List lsRecords=readData("D:/Data.txt");
    sortRecord(lsRecords,"des");
    writeData(lsRecords);
    }catch(FileNotFoundException ex){
    System.out.println("无法读取数据文件!");
    }catch(Exception ex){
    System.out.println(ex.getMessage());
    }
    }

    public static List readData(String sFilePath) throws Exception{
    BufferedReader bufreader=null;
    List lsRecords=new ArrayList();

    try{
    StringBuffer sbData=new StringBuffer();
    String sLineData=null;
    bufreader=new BufferedReader(new FileReader(sFilePath));
    Pattern p=Pattern.compile(
    "^\\s*(.*?)\\s+(\\d+)\\s*$",
    Pattern.MULTILINE);
    Matcher m;
    while((sLineData=bufreader.readLine())!=null){
    m=p.matcher(sLineData);
    if(m.find())
    lsRecords.add(m.group(1)+":"+m.group(2));
    }
    }catch(Exception ex){
    throw ex;
    }finally{
    try{
    if(bufreader!=null)
    bufreader.close();
    }catch(Exception ex){}
    }

    return lsRecords;
    }

    public static void sortRecord(List lsRecords,String sSortSty){
    Comparator AscCmp=new Comparator(){
    public int compare(Object o1,Object o2){
    String str1=(String)o1;
    String str2=(String)o2;
    int int1=Integer.parseInt(
    str1.substring(str1.indexOf(':')+1));
    int int2=Integer.parseInt(
    str2.substring(str2.indexOf(':')+1));

    return int1<int2?-1:1;
    }
    };

    Comparator DesCmp=new Comparator(){
    public int compare(Object o1,Object o2){
    String str1=(String)o1;
    String str2=(String)o2;
    int int1=Integer.parseInt(
    str1.substring(str1.indexOf(':')+1));
    int int2=Integer.parseInt(
    str2.substring(str2.indexOf(':')+1));

    return int1<int2?1:-1;
    }
    };

    if(sSortSty.equals("des"))
    Collections.sort(lsRecords,DesCmp);
    else
    Collections.sort(lsRecords,AscCmp);
    }

    public static void writeData(List lsRecords) throws Exception{
    BufferedWriter bufwriter=null;

    try{
    bufwriter=new BufferedWriter(new FileWriter("D:/SortedData.txt"));
    String sLineData=null;

    Iterator i=lsRecords.iterator();
    while(i.hasNext()){
    sLineData=(String)i.next();
    sLineData=sLineData.replaceAll(":", "  ")+"\n";
    bufwriter.write(sLineData);
    }
    }catch(Exception ex){
    throw ex;
    }finally{
    try{
    if(bufwriter!=null)
    bufwriter.close();
    }catch(Exception ex){}
    }
    }
    }
      

  5.   

    ArrayList的Iterator也会打乱排序顺序吗?这我没有想过,我要查一下。