指定目录,找出前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);
}