社区
Java SE
帖子详情
再次提问---如何得到一个目录下按last modify时间排序的文件名列表?
ghw
2002-01-14 03:03:01
昨天我问了个“如何得到一个目录下按last modify时间排序的文件名列表”的问题,也有人回答了,我也把帖子结了,但后来发现还是有些问题,大家再看看有没有好方法?
那个帖子的链接:http://www.csdn.net/Expert/topic/475/475161.shtm
...全文
261
18
打赏
收藏
再次提问---如何得到一个目录下按last modify时间排序的文件名列表?
昨天我问了个“如何得到一个目录下按last modify时间排序的文件名列表”的问题,也有人回答了,我也把帖子结了,但后来发现还是有些问题,大家再看看有没有好方法? 那个帖子的链接:http://www.csdn.net/Expert/topic/475/475161.shtm
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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
打赏
举报
回复
怎么想送分都难呢? 没人想要吗?
mysql数据库的基本操作语法
外键约束是保证
一个
或两个表之间的参照完整性,外键是构建于
一个
表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不...
Linux系统下查找最近修改过的文件
比如按名字查找
一个
文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为
一个
野蛮有效的方法。 按
时间
查找也有参数 -atime 访问
时间
-ctime 改变状态的
时间
-mtime修改的...
全网最新版openlayers视频教程
学习关于二维地理图层渲染,投影转换,各种数据类型渲染,OGC服务,各种地图交互
【转载】Linux系统下查找最近修改过的文件
比如按名字查找
一个
文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为
一个
野蛮有效的方法。 按
时间
查找也有参数 -atime 访问
时间
-ctime 改变状态的
时间
-mtime修改的...
Linux指令(详细版)
ls -a:列出
目录
中的所有文件,包括以点(.)开头的隐藏...ls -t:按照最后修改
时间
排序
文件和
目录
。ls -S:按文件大小
排序
。ls -r:逆序排列文件(与-t或-S结合使用时非常有用)。ls -R:递归地列出所有子
目录
的内容。
Java SE
62,616
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章