• 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper


    FileSortHelper的核心功能就是,对文件集合FileInfo排序。
    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包关联比较大,后面在一起讲解。
  • 相关阅读:
    jenkins2.0以后的版本提供自动部署和远程部署功能?
    测试之路之同事
    jmeter分布式压力测试实践+登录为例
    模板渲染jnja2模块
    10 分离式web框架
    09 基于模块wsgiref版web框架
    08 返回动态页面web框架
    07 返回多个页面web框架
    06 返回静态文件的映射(函数/多线程)web框架
    05 返回静态文件的多线程web框架
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462635.html
Copyright © 2020-2023  润新知