社区
Java SE
帖子详情
再次提问---如何得到一个目录下按last modify时间排序的文件名列表?
ghw
2002-01-14 03:03:01
昨天我问了个“如何得到一个目录下按last modify时间排序的文件名列表”的问题,也有人回答了,我也把帖子结了,但后来发现还是有些问题,大家再看看有没有好方法?
那个帖子的链接:http://www.csdn.net/Expert/topic/475/475161.shtm
...全文
354
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
打赏
举报
回复
怎么想送分都难呢? 没人想要吗?
SAS 分组与
排序
SAS 分组与
排序
SAS对数据集进行操作时,经常需要在SET、MERGE、
MODIFY
或 UPDATE语句中使用分组数据。使用分组数据最基本的方法是使用BY 语句,其基本形式如下: BY 变量
列表
; BY语句除了可用于DATA步中对数据集进行操作外,也可以用于 SAS PROC步。在这些地方使用分组数据时,要求所有的观测必须按BY 语句中的变量以数字或字符顺序升序或降序排列,或者...
postgresql多列综合
排序
postgresql 多列综合
排序
需求 最近做项目遇到
一个
需求:对数据按照更新
时间
和创建
时间
进行综合
排序
,即对数据的操作
时间
进行
排序
,但是数据表中没有操作
时间
这个字段,需要根据更新
时间
和创建
时间
进行处理。更新
时间
存在时,按照更新
时间
排序
,更新
时间
不存在时,使用创建
时间
排序
,最后更新
时间
和创建
时间
一起
排序
。用数据举例说明: 原始数据: 想要的
排序
结果: postgresql
排序
语法 SELECT column_list FROM table_name ORDER BY sort_exp
Playwright for Python 仓库开发指南:从架构布局到 API 代码生成、驱动装配与版本滚动全解析
本篇技术指南围绕 `playwright-python` 仓库的 `CLAUDE.md` 开发者手册展开,系统讲解 Python 绑定层的整体架构(Python 客户端经管道与 Node 驱动通信)、`_impl/` 手写实现与 `_generated.py` 自动生成文件的职责划分、Driver 与 Node.js 的版本钉住机制、`update_api.sh` 驱动的 API 代码生成与校验流
mysql utc
时间
格式化
SELECT *,FROM_UNIXTIME(last_
modify
_date,'%m-%d-%Y') FROM his where goods_id = 4640 order by last_
modify
_date desc;
Python
列表
全面指南:从基础操作到高级技巧
列表
是Python中最基础且强大的数据结构,作为可变序列类型,它支持存储异构数据、动态扩容和丰富的内置方法。从数据结构原理看,
列表
基于动态数组实现,既保持了O(1)
时间
复杂度的随机访问特性,又通过超额分配策略优化了追加操作性能。在实际开发中,
列表
推导式能显著提升代码简洁性,而切片操作、
排序
方法等特性使其成为数据处理的首选工具。特别是在爬虫开发、算法实现和Web应用等场景中,
列表
的高效操作能大幅提升开发效率。掌握
列表
的深浅拷贝机制、性能优化技巧以及与deque等替代结构的对比选择,是写出高质量Python代码
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章