从目录 - Java获取最高数字文件名(作为int)

时间:2016-01-13 17:34:29

标签: java dir

鉴于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 +),我的担忧与性能有关。

这是否是一个可接受的解决方案?还有更好的方法吗?

3 个答案:

答案 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));
    }
}
相关问题