鉴于File dir
我需要找到最高的数字文件名(如果存在)
我的方法:
// get the highest numeric file name(as int) from given directory
public static final int getHighestNumericFileName(File dir) {
int result = -1;
for (File f : dir.listFiles()) {
String name = f.getName();
name = name.substring(0, name.indexOf('.'));
if (StringUtils.isNumeric(name)) {
int val = Integer.parseInt(name);
if (val > result)
result = val;
}
}
return result;
}
考虑到文件夹中的文件数量可能会非常大(300k +),我的担忧与性能有关。
这是否是一个可接受的解决方案?还有更好的方法吗?
答案 0 :(得分:2)
您可以使用Java 7 NIO DirectoryStream
使用过滤器浏览文件,以确保忽略与您无关的文件。
以下是过滤器:
class NumericFilter implements DirectoryStream.Filter<Path> {
private static final Pattern PATTERN = Pattern.compile("\\d+|\\d+\\..*");
@Override
public boolean accept(Path entry) throws IOException {
return PATTERN.matcher(entry.getFileName().toString()).matches();
}
}
以下是使用它的代码:
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir), new NumericFilter())) {
for (Path path : stream) {
// do what you want
}
}
这将仅通过具有完全数字名称的文件(没有或带有任何扩展名)。
只是为了记录,这是一个稍微简单的方法来对Java 8做同样的事情:
final Pattern pattern = Pattern.compile("\\d+\\..*");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir),
entry -> pattern.matcher(entry.getFileName().toString()).matches())) {
for (Path path : stream) {
// do what you want
}
}
答案 1 :(得分:1)
我建议你对文件进行排序,然后选择第一个条目或最后一个条目。
FileFilter fileFilter = new WildcardFileFilter("\\d+.txt");
File[] files = dir.listFiles(fileFilter);
Arrays.sort(files);//sorts lexicographically
答案 2 :(得分:0)
对于非常大量的数字,对它们进行排序的最佳方法是使用Heap Sort
。例如
int[] yourFiles = {} //Puts all file names in array
HeapSort.sort(yourFiles);
result = yourFiles[yourFilens.length-1];
<强>堆排序强>
public class HeapSort
{
private static int[] a;
private static int n;
private static int left;
private static int right;
private static int largest;
public static void buildheap(int []a)
{
n=a.length-1;
for(int i=n/2;i>=0;i--)
{
maxheap(a,i);
}
}
public static void maxheap(int[] a, int i)
{
left=2*i;
right=2*i+1;
if(left <= n && a[left] > a[i])
{
largest=left;
}
else
{
largest=i;
}
if(right <= n && a[right] > a[largest])
{
largest=right;
}
if(largest!=i)
{
exchange(i,largest);
maxheap(a, largest);
}
}
public static void exchange(int i, int j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void sort(int[] a0)
{
a=a0;
buildheap(a);
for(int i=n;i>0;i--)
{
exchange(0, i);
n=n-1;
maxheap(a, 0);
}
}
}
这样的一个示例实现是。
import java.util.Arrays;
public class Test
{
public static void main(String[] args)
{
int[] test = {1,5,6,8,6,41};
HeapSort.sort(test);
System.out.println(Arrays.toString(test));
}
}