是这样的,用lastModify作为key的方法有些问题,如果一个目录下有几个文件的lastModify完全相同就会有错误,我在那个贴子里续贴了几条。按使用TreeMap的思路,只有拿"lastModify+fileName"作为key了。后来我发现这样做的效率比较低,一个目录下有几万个文件的话,这个过程需要好几十秒。我想看看还有没有更好的方法。 

解决方案 »

  1.   

    你可以这样做,如果发现已经有相同时间的文件,那么对应这个key的对象则为一个文件列表,可以选择Object[], Vector实现。在需要处理时判断对象类型,如果不是文件则是文件列表,你看这样可以解决吧
      

  2.   

    下面是我改进过的算法
    import java.io.*;
    import java.lang.*;
    import java.util.*;...    TreeMap tm=new TreeMap();
        File f=new File("C:\\");
        File subFile[]=f.listFiles();
        int fileNum=subFile.length;
        int zeroNum=fileNum/10+1;//文件个数的位数
        for(int i=0;i<fileNum;i++)
          {
            Long tempLong=new Long(subFile[i].lastModified()*zeroNum+1);//在Long后面加上i
            tm.put(tempLong,subFile[i]);
          }
      Set set=tm.keySet();
      Iterator iter=set.iterator();
      while(iter.hasNext())
      {
        Object key=iter.next();
        Object objValue=tm.get(key);
        File tempFile=(File)objValue;
        System.out.println(tempFile.getPath()+"\t"+key.toString());
      }  
      

  3.   

    真是不好意思,又有写错的,哈哈
    int zeroNum=fileNum/10+1;
    改为
    int zeroNum=String.valueOf(fileNum).length();
      

  4.   

    我刚才又试了一下,使用lastModify+fileName作为key的话,取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要7秒~10秒。   昨天的测试把输出到文件的时间也算上了。to zych72(闹闹):
    那样做的话只会效率更低下。to z_yheart(年轻的心):
    你的这行代码会起作用吗?
    Long tempLong=new Long(subFile[i].lastModified()*zeroNum+1);
    在for循环zeroNum的值可是固定不变的。
      

  5.   

    你的意思是Long tempLong=new Long(subFile[i].lastModified()*zeroNum+i);吧。
      

  6.   

    试试这个看看:))
    --------
    import java.util.*;
    import java.text.*;
    import java.io.*;
    import java.sql.*;
    public class myTest{ 
      public static void main(String[] args) {
        File f=new File("C:\\");
        File subFile[]=f.listFiles();
        int fileNum=subFile.length;
        int zeroNum=fileNum/10+1;//文件个数的位数
        List lis=new ArrayList(fileNum);
        String temp;
        for(int i=0;i<fileNum;i++)
          {
            temp=String.valueOf(subFile[i].lastModified()).concat("--abc--").concat(subFile[i].getName());
            lis.add(new String(temp));
          }
        Collections.sort(lis);
        for(int i=0;i<lis.size();i++){
         temp=(String)lis.get(i);
         temp=temp.substring(temp.indexOf("--abc--")+7);
         System.out.println(temp);
        }
     }
    }
      

  7.   

    TreeMap的排序速度应该已经是相当快了,其时间复杂度为lgn,就是说插入1000比较10次
      

  8.   

    temp=String.valueOf(subFile[i].lastModified()).concat("--abc--").concat(subFile[i].getName());
            更正为:
    temp=String.valueOf(subFile[i].lastModified());
            temp="0000000000000000000".substring(0,(19-temp.length())).concat(temp).concat("--abc--").concat(subFile[i].getName());
            
      

  9.   

    呵呵,楼上的老兄倒挺会玩。不过你的代码有一行要注意(在for循环中):
    temp=String.valueOf(subFile[i].lastModified()).concat("--abc--").concat(subFile[i].getName());在concat("--abc--")和concat(subFile[i].getName())之前的String.valueOf(subFile[i].lastModified()),要注意把这个字符串转化成固定长度。另外那个"--abc--"就不必要了吧。
      

  10.   

    to : ghw(大浪淘沙):
    "--abc--"是不用了,刚可是只是为了区分从那开始是文件名,
    现在前面的时间长度固定了,可以直接去掉。
    19 是long最大值toString的长度!
      

  11.   

    to : ghw(大浪淘沙):
    对了别忘了把测试时间贴出来我想了解要花多长时间!谢谢!!!
      

  12.   

    取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要的时间:
    1.使用ArrayList的方法需要4~5秒。  (使用xmvigour(微电)的代码。)
    2.使用TreeMap的方法需要3~4秒。   (使用z_yheart(年轻的心)的代码。)
    散分啦!