再次提问---如何得到一个目录下按last modify时间排序的文件名列表?

ghw 2002-01-14 03:03:01
昨天我问了个“如何得到一个目录下按last modify时间排序的文件名列表”的问题,也有人回答了,我也把帖子结了,但后来发现还是有些问题,大家再看看有没有好方法?

那个帖子的链接:http://www.csdn.net/Expert/topic/475/475161.shtm
...全文
157 点赞 收藏 18
写回复
18 条回复
z_yheart 2002年01月15日
真是不好意思,又有写错的,哈哈
int zeroNum=fileNum/10+1;
改为
int zeroNum=String.valueOf(fileNum).length();
回复 点赞
z_yheart 2002年01月15日
下面是我改进过的算法


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());
}
回复 点赞
zych72 2002年01月15日
你可以这样做,如果发现已经有相同时间的文件,那么对应这个key的对象则为一个文件列表,可以选择Object[], Vector实现。在需要处理时判断对象类型,如果不是文件则是文件列表,你看这样可以解决吧
回复 点赞
ghw 2002年01月15日
是这样的,用lastModify作为key的方法有些问题,如果一个目录下有几个文件的lastModify完全相同就会有错误,我在那个贴子里续贴了几条。

按使用TreeMap的思路,只有拿"lastModify+fileName"作为key了。

后来我发现这样做的效率比较低,一个目录下有几万个文件的话,这个过程需要好几十秒。

我想看看还有没有更好的方法。
回复 点赞
ghw 2002年01月15日
取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要的时间:
1.使用ArrayList的方法需要4~5秒。 (使用xmvigour(微电)的代码。)
2.使用TreeMap的方法需要3~4秒。 (使用z_yheart(年轻的心)的代码。)


散分啦!
回复 点赞
xmvigour 2002年01月15日
to : ghw(大浪淘沙):
对了别忘了把测试时间贴出来我想了解要花多长时间!谢谢!!!
回复 点赞
xmvigour 2002年01月15日
to : ghw(大浪淘沙):
"--abc--"是不用了,刚可是只是为了区分从那开始是文件名,
现在前面的时间长度固定了,可以直接去掉。
19 是long最大值toString的长度!
回复 点赞
ghw 2002年01月15日
刚看到长度问题,你的贴子就先上来了。
回复 点赞
ghw 2002年01月15日
呵呵,楼上的老兄倒挺会玩。

不过你的代码有一行要注意(在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--"就不必要了吧。
回复 点赞
xmvigour 2002年01月15日
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());
回复 点赞
z_yheart 2002年01月15日
TreeMap的排序速度应该已经是相当快了,其时间复杂度为lgn,就是说插入1000比较10次
回复 点赞
xmvigour 2002年01月15日
试试这个看看:))
--------
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);
}
}
}
回复 点赞
z_yheart 2002年01月15日
是加上i,不是加1,打错了
回复 点赞
ghw 2002年01月15日
有没有不用TreeMap的方法?
回复 点赞
ghw 2002年01月15日
你的意思是Long tempLong=new Long(subFile[i].lastModified()*zeroNum+i);吧。
回复 点赞
ghw 2002年01月15日
我刚才又试了一下,使用lastModify+fileName作为key的话,取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要7秒~10秒。 昨天的测试把输出到文件的时间也算上了。

to zych72(闹闹):
那样做的话只会效率更低下。

to z_yheart(年轻的心):
你的这行代码会起作用吗?
Long tempLong=new Long(subFile[i].lastModified()*zeroNum+1);
在for循环zeroNum的值可是固定不变的。


回复 点赞
z_yheart 2002年01月14日
还有什么问题?
回复 点赞
ghw 2002年01月14日
怎么想送分都难呢? 没人想要吗?
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告