Junhc

岂止于博客

指定目录,找出前N个最大文件,并输出文件全路径

借助TreeMap,简单粗暴
// 倒序
private static TreeMap<Long, List<String>> toMap = new TreeMap<>(Comparator.reverseOrder());

public static void main(String[] args) {
    // 递归读取文件大小、全路径
    getFile(new File(".."));
    //
    int n = 3;
    for (Long l : toMap.keySet()) {
        if (n-- <= 0) {
             break;
        }
        System.out.println(l + " : " + JSON.toJSONString(toMap.get(l)));
    }
}

public static void getFile(File file) {
    File[] files = file.listFiles();
    for (File f : files) {
        if (f.isDirectory()) {
            getFile(f);
        } else if (f.isFile()) {
            if (!toMap.containsKey(f.length())) {
                toMap.put(f.length(), Lists.newArrayList());
            }
            toMap.get(f.length()).add(f.getPath());
        }
    }
}
从海量数据中查找出前K个最小或最大值的算法
思路一、基于partition函数,时间复杂度o(n)

基于数组中的第K个数来做调整,使得数组中比第K个数小的数都位于它的左边,比第K个数大的数都位于它的右边,
调整之后位于最前面的K个数就是所求。

public static void quickSort(int a[]) {
    sort(a, 0, a.length - 1);
}

public static void sort(int a[], int low, int high) {
    int i, j, index;
    if (low > high) {
        return;
    }
    i = low;
    j = high;
    // 用子表的第一个记录做基准
    index = a[i];
    while (i < j) {
        // 从表的两端交替向中间扫描
        while (i < j && a[j] >= index) {
            j--;
        }
        if (i < j) {
            // 用比基准小的记录替换低位记录
            a[i++] = a[j];
        }
        while (i < j && a[i] < index) {
            i++;
        }
        if (i < j) {
            // 用比基准大的记录替换高位记录
            a[j--] = a[i];
        }
    }
    // 将基准数值替换回 a[i]
    a[i] = index;
    // 对低子表进行递归排序
    sort(a, low, i - 1);
    // 对高子表进行递归排序
    sort(a, i + 1, high);

}
参考资料

漫画:什么是快速排序