对目录文件进行排序
基本函数
1、按名字中文拼音字母排序
/**
* 根据中文拼音字母排列,且先中文,后英文
*
* @param files, 文件列表
*/
public static void sortNameInChina(List<File> files) {
Collections.sort(files, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
return cmp.compare(o1.getName(), o2.getName());
}
});
}
2、按后缀排序
/**
* 根据后缀排列
*
* @param files, 文件列表
*/
public static void sortBySuffix(List<File> files) {
Collections.sort(files, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
String name1 = o1.getName();
String name2 = o2.getName();
return cmp.compare(name1.substring(name1.lastIndexOf(".")), name2.substring(name2.lastIndexOf(".")));
}
});
}
一、按名字排序
/**
* 按照文件名称排序
* @param files ,所有文件(夹)
* @return 排序后的文件(夹)
*/
public static List<File> orderByName(List<File> files) {
List<File> justPaths = new ArrayList<File>();
List<File> justFiles = new ArrayList<File>();
List<File> fileLists = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
justPaths.add(file);
} else {
justFiles.add(file);
}
}
// 目录按名称排序
sortNameInChina(justPaths);
// 文件按名称排序
sortNameInChina(justFiles);
fileLists.addAll(justPaths);
fileLists.addAll(justFiles);
// System.out.println("filelists:" + fileLists); 这样打印会导致下面的错误
//GC_CONCURRENT freed 1593K, 40% free 8450K/13955K, paused 274ms+265ms, total 623ms
return fileLists;
}
二、按大小排序
/**
* 按照文件大小排序,文件夹只是按名称排序,文件按大小排序
* @param files ,所有文件(夹)
* @return 排序后的文件(夹)
*/
public static List<File> orderByLength(List<File> files) {
List<File> justPaths = new ArrayList<File>();
List<File> justFiles = new ArrayList<File>();
List<File> fileLists = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
justPaths.add(file);
} else {
justFiles.add(file);
}
}
// 目录按名称排序
sortNameInChina(justPaths);
// 文件按大小排序
Collections.sort(justFiles, new Comparator<File>() {
public int compare(File f1, File f2) {
long diff = f1.length() - f2.length();
if (diff > 0)
return 1;
else if (diff == 0)
return 0;
else
return -1;
}
public boolean equals(Object obj) {
return true;
}
});
fileLists.addAll(justPaths);
fileLists.addAll(justFiles);
for (File file:fileLists) {
System.out.println("file name:" + file.getName());
}
return fileLists;
}
三、按时间排序
/**
* 按照文件大小排序,文件夹只是按名称排序,文件按大小排序
* @param files ,所有文件(夹)
* @return 排序后的文件(夹)
*/
public static List<File> orderByLength(List<File> files) {
List<File> justPaths = new ArrayList<File>();
List<File> justFiles = new ArrayList<File>();
List<File> fileLists = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
justPaths.add(file);
} else {
justFiles.add(file);
}
}
// 目录按名称排序
sortNameInChina(justPaths);
// 文件按大小排序
Collections.sort(justFiles, new Comparator<File>() {
public int compare(File f1, File f2) {
long diff = f1.length() - f2.length();
if (diff > 0)
return 1;
else if (diff == 0)
return 0;
else
return -1;
}
public boolean equals(Object obj) {
return true;
}
});
fileLists.addAll(justPaths);
fileLists.addAll(justFiles);
for (File file:fileLists) {
System.out.println("file name:" + file.getName());
}
return fileLists;
}
四、按类型排序
1、
/**
* 按文件类型排序
* @param files ,所有文件(夹)
* @return 排序后的文件(夹)
*/
public static List<File> orderByType(List<File> files) {
List<File> justPaths = new ArrayList<File>();
List<File> suffixFiles = new ArrayList<File>();
List<File> noSuffixFiles = new ArrayList<File>();
List<File> fileLists = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
justPaths.add(file);
} else {
if (file.getName().indexOf(".") != -1) {
suffixFiles.add(file);
} else {
noSuffixFiles.add(file);
}
}
}
sortNameInChina(justPaths);
sortNameInChina(suffixFiles);
sortBySuffix(suffixFiles);
sortNameInChina(noSuffixFiles);
fileLists.addAll(justPaths);
fileLists.addAll(suffixFiles);
fileLists.addAll(noSuffixFiles);
// System.out.println("filelists:" + fileLists);
return fileLists;
}
2、
/**
* 按文件类型排序
* @param files ,所有文件(夹)
* @return 排序后的文件(夹)
*/
public static List<File> orderByType(List<File> files) {
List<File> justPaths = new ArrayList<File>();
List<File> justFiles = new ArrayList<File>();
List<File> videoFiles = new ArrayList<File>();
List<File> musicFiles = new ArrayList<File>();
List<File> photoFiles = new ArrayList<File>();
List<File> pdfFiles = new ArrayList<File>();
List<File> docFiles = new ArrayList<File>();
List<File> xlsFiles = new ArrayList<File>();
List<File> pptFiles = new ArrayList<File>();
List<File> apkFiles = new ArrayList<File>();
List<File> htmlFiles = new ArrayList<File>();
List<File> torrentFiles = new ArrayList<File>();
List<File> otherFiles = new ArrayList<File>();
List<File> fileLists = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
justPaths.add(file);
} else {
justFiles.add(file);
}
}
for (File file : files) {
String filename = file.getName();
if (isVideo(filename))
videoFiles.add(file);
else if (isMusic(filename))
musicFiles.add(file);
else if (isPhoto(filename))
photoFiles.add(file);
else if (isApk(filename))
apkFiles.add(file);
else if (isHtml(filename))
htmlFiles.add(file);
else if (isPdf(filename))
pdfFiles.add(file);
else if (isDoc(filename))
docFiles.add(file);
else if (isPpt(filename))
pptFiles.add(file);
else if (isXls(filename))
xlsFiles.add(file);
else if (isTorrent(filename))
torrentFiles.add(file);
else
otherFiles.add(file);
}
sortNameInChina(justPaths);
sortNameInChina(photoFiles);
sortNameInChina(musicFiles);
sortNameInChina(videoFiles);
sortNameInChina(apkFiles);
sortNameInChina(htmlFiles);
sortNameInChina(pdfFiles);
sortNameInChina(docFiles);
sortNameInChina(xlsFiles);
sortNameInChina(pptFiles);
sortNameInChina(torrentFiles);
sortNameInChina(otherFiles);
fileLists.addAll(justPaths);
fileLists.addAll(photoFiles);
fileLists.addAll(musicFiles);
fileLists.addAll(videoFiles);
fileLists.addAll(apkFiles);
fileLists.addAll(htmlFiles);
fileLists.addAll(pdfFiles);
fileLists.addAll(docFiles);
fileLists.addAll(xlsFiles);
fileLists.addAll(pptFiles);
fileLists.addAll(torrentFiles);
fileLists.addAll(otherFiles);
return fileLists;
}
五、快速排序
/**
* 快速排序
* @param targetArr 文件列表
* @param start 开始位置
* @param end 结束位置
* @param sortType 排序类型
* @return
*/
public static List<File> quickSort(List<File> targetArr, int start,
int end, int sortType) {
if (targetArr.size() == 0)
return targetArr;
int i = start, j = end;
File key = targetArr.get(start);
switch (sortType) {
//by size
case 1 :
while (i < j) {
while (j > i && ((targetArr.get(j).length() - key.length()) >= 0 )) {
j--;
}
if (i < j) {
targetArr.set(i, targetArr.get(j));
}
while (i < j && ((targetArr.get(i).length() - key.length()) <= 0 )) {
i++;
}
if (i < j) {
targetArr.set(j, targetArr.get(i));
}
}
break;
//by type(with suffix)
case 2 :
while (i < j) {
while (j > i && ((targetArr.get(j).getName().substring(targetArr.get(j).getName().lastIndexOf(".")).compareToIgnoreCase
(key.getName().substring(key.getName().lastIndexOf("."))) >= 0 ))) {
j--;
}
if (i < j) {
targetArr.set(i, targetArr.get(j));
}
while (i < j && ((targetArr.get(i).getName().substring(targetArr.get(i).getName().lastIndexOf(".")).compareToIgnoreCase
(key.getName().substring(key.getName().lastIndexOf("."))) <= 0 ))) {
i++;
}
if (i < j) {
targetArr.set(j, targetArr.get(i));
}
}
break;
//by time
case 3 :
while (i < j) {
while (j > i && ((targetArr.get(j).lastModified() - key.lastModified()) >= 0 )) {
j--;
}
if (i < j) {
targetArr.set(i, targetArr.get(j));
}
while (i < j && ((targetArr.get(i).lastModified() - key.lastModified()) <= 0 )) {
i++;
}
if (i < j) {
targetArr.set(j, targetArr.get(i));
}
}
break;
//by name
default :
Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
while (i < j) {
// 按j--方向遍历目标数组,直到比key小的值为止
while (j > i
&& cmp.compare(targetArr.get(j).getName(),
key.getName()) >= 0) {
j--;
}
if (i < j) {
// targetArr[i]已经保存在key中,可将后面的数填入
targetArr.set(i, targetArr.get(j));
}
// 按i++方向遍历目标数组,直到比key大的值为止
while (i < j
&& cmp.compare(targetArr.get(i).getName(),
key.getName()) <= 0) {// 此处一定要小于等于零,假设数组之内有一亿个1,0交替出现的话,而key的值又恰巧是1的话,那么这个小于等于的作用就会使下面的if语句少执行一亿次。
i++;
}
if (i < j) {
// targetArr[j]已保存在targetArr[i]中,可将前面的值填入
targetArr.set(j, targetArr.get(i));
}
}
break;
}
// 此时i==j
targetArr.set(i, key);
if (i - start > 1) {
// 递归调用,把key前面的完成排序
quickSort(targetArr, start, i - 1, sortType);
}
if (end - j > 1) {
// 递归调用,把key后面的完成排序
quickSort(targetArr, j + 1, end, sortType);
}
return targetArr;
}