gpt4 book ai didi

java - 在一长串文件中查找 3 个最近修改的文件

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:47 57 4
gpt4 key购买 nike

我有一个文件列表,我想对它进行排序并提取最后修改的前 3 个。

约束:由于下游应用程序的兼容性问题,我无法使用 Java 7

我当前的选择

解决方案一

File[] files = directory.listFiles();    
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });

解决方案2

public static void sortFilesDesc(File[] files) {
Arrays.sort(files, new Comparator() {
public int compare(Object o1, Object o2) {
if ((File)o1).lastModified().compareTo((File)o2).lastModified()) {
return -1;
} else if (((File) o1).lastModified() < ((File) o2).lastModified()) {
return +1;
} else {
return 0;
}
}
});
}

问题

以上两种解决方案需要更多的执行时间和内存。我的文件列表包含大约 300 个 tar 文件,每个文件大小为 200MB。所以它会消耗更多的时间和内存。

有什么办法可以有效地处理这个问题吗?

每个比较操作都使用一个高内存的文件对象,有什么方法可以释放内存并有效地处理这个问题吗?

最佳答案

你可以做得更快。

Arrays.sort(...) 使用“快速排序”,需要~ n * ln(n) 操作。

此示例仅对整个数组进行一次迭代,即 ~ n 次操作。

public static void sortFilesDesc(File[] files) {        
File firstMostRecent = null;
File secondMostRecent = null;
File thirdMostRecent = null;
for (File file : files) {
if ((firstMostRecent == null)
|| (firstMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = secondMostRecent;
secondMostRecent = firstMostRecent;
firstMostRecent = file;
} else if ((secondMostRecent == null)
|| (secondMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = secondMostRecent;
secondMostRecent = file;
} else if ((thirdMostRecent == null)
|| (thirdMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = file;
}
}
}

对于少量文件,您不会看到太大差异,但即使对于数十个文件,差异也会很显着,对于更大的数字 - 非常显着。

检查算法的代码(请输入正确的文件结构):

package com.hk.basicjava.clasload.tests2;

import java.io.File;
import java.util.Date;


class MyFile extends File {

private long time = 0;

public MyFile(String name, long timeMills) {
super(name);
time = timeMills;
}
@Override
public long lastModified() {
return time;
}
}

public class Files {

/**
* @param args
*/
public static void main(String[] args) {

File[] files = new File[5];
files[0] = new MyFile("File1", new Date(2013,1,15, 7,0).getTime());
files[1] = new MyFile("File2", new Date(2013,1,15, 7,40).getTime());
files[2] = new MyFile("File3", new Date(2013,1,15, 5,0).getTime());
files[3] = new MyFile("File4", new Date(2013,1,15, 10,0).getTime());
files[4] = new MyFile("File5", new Date(2013,1,15, 4,0).getTime());
sortFilesDesc(files);
}

public static void sortFilesDesc(File[] files) {
File firstMostRecent = null;
File secondMostRecent = null;
File thirdMostRecent = null;
for (File file : files) {
if ((firstMostRecent == null)
|| (firstMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = secondMostRecent;
secondMostRecent = firstMostRecent;
firstMostRecent = file;
} else if ((secondMostRecent == null)
|| (secondMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = secondMostRecent;
secondMostRecent = file;
} else if ((thirdMostRecent == null)
|| (thirdMostRecent.lastModified() < file.lastModified())) {
thirdMostRecent = file;
}
}
System.out.println("firstMostRecent : " + firstMostRecent.getName());
System.out.println("secondMostRecent : " + secondMostRecent.getName());
System.out.println("thirdMostRecent : " + thirdMostRecent.getName());
}

}

关于java - 在一长串文件中查找 3 个最近修改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372822/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com