再次提问---如何得到一个目录下按last modify时间排序的文件名列表? 是这样的,用lastModify作为key的方法有些问题,如果一个目录下有几个文件的lastModify完全相同就会有错误,我在那个贴子里续贴了几条。按使用TreeMap的思路,只有拿"lastModify+fileName"作为key了。后来我发现这样做的效率比较低,一个目录下有几万个文件的话,这个过程需要好几十秒。我想看看还有没有更好的方法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以这样做,如果发现已经有相同时间的文件,那么对应这个key的对象则为一个文件列表,可以选择Object[], Vector实现。在需要处理时判断对象类型,如果不是文件则是文件列表,你看这样可以解决吧 下面是我改进过的算法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()); } 真是不好意思,又有写错的,哈哈int zeroNum=fileNum/10+1;改为int zeroNum=String.valueOf(fileNum).length(); 我刚才又试了一下,使用lastModify+fileName作为key的话,取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要7秒~10秒。 昨天的测试把输出到文件的时间也算上了。to zych72(闹闹):那样做的话只会效率更低下。to z_yheart(年轻的心):你的这行代码会起作用吗?Long tempLong=new Long(subFile[i].lastModified()*zeroNum+1);在for循环zeroNum的值可是固定不变的。 你的意思是Long tempLong=new Long(subFile[i].lastModified()*zeroNum+i);吧。 试试这个看看:))--------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); } }} TreeMap的排序速度应该已经是相当快了,其时间复杂度为lgn,就是说插入1000比较10次 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()); 呵呵,楼上的老兄倒挺会玩。不过你的代码有一行要注意(在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--"就不必要了吧。 to : ghw(大浪淘沙):"--abc--"是不用了,刚可是只是为了区分从那开始是文件名,现在前面的时间长度固定了,可以直接去掉。19 是long最大值toString的长度! to : ghw(大浪淘沙):对了别忘了把测试时间贴出来我想了解要花多长时间!谢谢!!! 取得一个包含两万多文件的目录的按lastModify排序的文件名列表需要的时间:1.使用ArrayList的方法需要4~5秒。 (使用xmvigour(微电)的代码。)2.使用TreeMap的方法需要3~4秒。 (使用z_yheart(年轻的心)的代码。)散分啦! 内部类值的输出疑问 问几个基础java知识 字符串~正则表达式 awt 文本框问题 请教一个单例模式问题 两句话,有点疑惑. java网络问题!不是很难,帮着看看吧!(2) 对话框里,如何将焦点设到指定的按钮 请教用socket通信的基本问题! How to ? 请问有谁知道jbuilder4.0的注册码? 判斷兩個char[]相等用什麽函數?我用(char1.equals(char2))它總是認爲不等,爲什麽??
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());
}
int zeroNum=fileNum/10+1;
改为
int zeroNum=String.valueOf(fileNum).length();
那样做的话只会效率更低下。to z_yheart(年轻的心):
你的这行代码会起作用吗?
Long tempLong=new Long(subFile[i].lastModified()*zeroNum+1);
在for循环zeroNum的值可是固定不变的。
--------
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);
}
}
}
更正为:
temp=String.valueOf(subFile[i].lastModified());
temp="0000000000000000000".substring(0,(19-temp.length())).concat(temp).concat("--abc--").concat(subFile[i].getName());
temp=String.valueOf(subFile[i].lastModified()).concat("--abc--").concat(subFile[i].getName());在concat("--abc--")和concat(subFile[i].getName())之前的String.valueOf(subFile[i].lastModified()),要注意把这个字符串转化成固定长度。另外那个"--abc--"就不必要了吧。
"--abc--"是不用了,刚可是只是为了区分从那开始是文件名,
现在前面的时间长度固定了,可以直接去掉。
19 是long最大值toString的长度!
对了别忘了把测试时间贴出来我想了解要花多长时间!谢谢!!!
1.使用ArrayList的方法需要4~5秒。 (使用xmvigour(微电)的代码。)
2.使用TreeMap的方法需要3~4秒。 (使用z_yheart(年轻的心)的代码。)
散分啦!