小米開原始檔管理器MiCodeFileExplorer-原始碼研究(8)-檔案排序工具類FileSortHelper
FileSortHelper的核心功能就是,對檔案集合FileInfo排序。
FileInfo有若干欄位,根據欄位定義了4種比較器Comparator。
呼叫示例:Collections.sort(List<FileInfo>, Comparator);
實現排序,FileInfo可以實現Comparable介面,但是比較方式是固定的,也就是說只能採用一種方式排序。
而Comparator則比較靈活,更像是一種“策略模式”,傳入不同的“策略”,實現不同方式的排序。
還有一些工具類,由於和impl包和UI包關聯比較大,後面在一起講解。
FileInfo有若干欄位,根據欄位定義了4種比較器Comparator。
呼叫示例:Collections.sort(List<FileInfo>, Comparator);
實現排序,FileInfo可以實現Comparable介面,但是比較方式是固定的,也就是說只能採用一種方式排序。
而Comparator則比較靈活,更像是一種“策略模式”,傳入不同的“策略”,實現不同方式的排序。
package net.micode.fileexplorer.util;
import java.util.Comparator;
import java.util.HashMap;
import net.micode.fileexplorer.model.FileInfo;
//檔案排序工具類
//可以按照檔案的名字、大小、日期、型別,排序
//呼叫示例:Collections.sort(List<FileInfo>, Comparator);
public class FileSortHelper {
public enum SortMethod {
name, size, date, type
}
// 排序型別
private SortMethod mSort;
// 是否檔案優先
private boolean mFileFirst;
// 比較器,這個才是關鍵,實現compare方法
private HashMap<SortMethod, Comparator> mComparatorList = new HashMap<SortMethod, Comparator>();
public FileSortHelper() {
mSort = SortMethod.name;
mComparatorList.put(SortMethod.name, cmpName);
mComparatorList.put(SortMethod.size, cmpSize);
mComparatorList.put(SortMethod.date, cmpDate);
mComparatorList.put(SortMethod.type, cmpType);
}
public void setSortMethog(SortMethod s) {
mSort = s;
}
public SortMethod getSortMethod() {
return mSort;
}
public void setFileFirst(boolean f) {
mFileFirst = f;
}
public Comparator getComparator() {
return mComparatorList.get(mSort);
}
private abstract class FileComparator implements Comparator<FileInfo> {
@Override
public int compare(FileInfo object1, FileInfo object2) {
if (object1.IsDir == object2.IsDir) {
return doCompare(object1, object2);
}
if (mFileFirst) {
// the files are listed before the dirs
return (object1.IsDir ? 1 : -1);
} else {
// the dir-s are listed before the files
return object1.IsDir ? -1 : 1;
}
}
protected abstract int doCompare(FileInfo object1, FileInfo object2);
}
private Comparator cmpName = new FileComparator() {
@Override
public int doCompare(FileInfo object1, FileInfo object2) {
return object1.fileName.compareToIgnoreCase(object2.fileName);
}
};
private Comparator cmpSize = new FileComparator() {
@Override
public int doCompare(FileInfo object1, FileInfo object2) {
return longToCompareInt(object1.fileSize - object2.fileSize);
}
};
private Comparator cmpDate = new FileComparator() {
@Override
public int doCompare(FileInfo object1, FileInfo object2) {
return longToCompareInt(object2.ModifiedDate - object1.ModifiedDate);
}
};
private int longToCompareInt(long result) {
return result > 0 ? 1 : (result < 0 ? -1 : 0);
}
private Comparator cmpType = new FileComparator() {
@Override
public int doCompare(FileInfo object1, FileInfo object2) {
int result = Util.getExtFromFilename(object1.fileName)
.compareToIgnoreCase(
Util.getExtFromFilename(object2.fileName));
if (result != 0)
return result;
return Util.getNameFromFilename(object1.fileName)
.compareToIgnoreCase(
Util.getNameFromFilename(object2.fileName));
}
};
}
還有一些工具類,由於和impl包和UI包關聯比較大,後面在一起講解。
相關文章
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(4)-檔案操作工具類FileOperationHelper原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(3)-使用最多的工具類Util原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(0)-初步研究原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(2)-2個單例項工具類原始碼單例
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(9)-入口分析原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(6)-媒體檔案MediaFile和檔案型別MimeUtils原始碼型別
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(1)-2個模型Model原始碼模型
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(5)-AsyncTask非同步任務原始碼非同步
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(7)-Favorite收藏管理和SQLite資料庫CRUD原始碼SQLite資料庫
- Java™ 教程(管理原始檔和類檔案)Java
- Vue原始碼探究-原始碼檔案組織Vue原始碼
- Lucene原始碼解析--Lock檔案原始碼
- 8.Python3原始碼—Code物件與pyc檔案Python原始碼物件
- 入口檔案開始,分析Vue原始碼實現Vue原始碼
- DRF之排序類原始碼分析排序原始碼
- PHP檔案分享系統原始碼PHP原始碼
- 原始碼解析Flask的配置檔案原始碼Flask
- Android 常用開發工具類原始碼Android原始碼
- 【PHP】CI框架原始碼分析核心檔案之Utf8.phpPHP框架原始碼
- FLASHCS3多檔案上傳原始碼(類似uccenter社群)S3原始碼
- VB原始碼推薦:一個操作Ini檔案的類 (轉)原始碼
- 安卓第一個作品 檔案管理器 附原始碼帶詳細註釋安卓原始碼
- XML檔案原始碼察看器(三) (轉)XML原始碼
- XML檔案原始碼察看器(四) (轉)XML原始碼
- XML檔案原始碼察看器(七) (轉)XML原始碼
- XML檔案原始碼察看器(二) (轉)XML原始碼
- XML檔案原始碼察看器(五) (轉)XML原始碼
- XML檔案原始碼察看器(六) (轉)XML原始碼
- cmakelist 原始碼生成so 檔案 orthanc mysql原始碼MySql
- Spring原始碼:使用Thymeleaf生成PDF檔案Spring原始碼
- .Net Core中的配置檔案原始碼解析原始碼
- vue原始碼分析系列之入口檔案分析Vue原始碼
- 【Visual Leak Detector】原始碼檔案概覽原始碼
- 原始碼解讀:GeneratorCommand(artisan 新建檔案)原始碼
- Lucene原始碼解析--刪除文件檔案(.del)原始碼
- list集合、txt檔案對比的工具類和檔案讀寫工具類
- 專案中常用的 .env 檔案原理原始碼分析原始碼
- 反編譯APK資原始檔與原始碼編譯APK原始碼