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包关联比较大,后面在一起讲解。

小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper的更多相关文章

  1. 小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究

    2011年对着书本Android应用开发揭秘,写了2个月的HelloWorld.   现在想复习并深入,我没有耐心再去一点点地敲代码了.   4年前自己是个学生,实习,现在有工作,只能业余时间研究. ...

  2. 小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils

    接着之前的第4篇,本篇的2个类,仍然是工具类.MediaFile,媒体文件,定义了一大堆的常量,真正的有用的方法就几个.isAudioFileType.isVideoFileType之类的. Mime ...

  3. Android开源项目 Universal imageloader 源码研究之Lru算法

    https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...

  4. 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model

    上篇说到,把小米的Java代码整理成了5个包,其中1个是net.micode.fileexplorer.model.这个包就2个模型类,最基本了,FileInfo和FavoriteItem. pack ...

  5. 小米开源文件管理器MiCodeFileExplorer-源码研究(5)-AsyncTask异步任务

    说明:本文的文字和代码,主要来自于网上的2篇文章. 第4篇的时候,提到了异步任务AsyncTask. 网上找了2篇文章学习下,copy网友的代码,稍微改了几个字,运行成功了. 在开发Android移动 ...

  6. 小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类

    从本篇开始,讲解net.micode.fileexplorer.util工具包中的类.这个包下的类,功能也比较单一和独立.很多代码的思想和实现,可以用于JavaWeb和Android等多种环境中. 一 ...

  7. 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util

    Util.java,使用最广泛~代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util; import java.io.Fil ...

  8. 开源播放器ijkplayer源码结构

    ijkplayer核心源码主要在ijkmedia文件夹下ijkplayer.ijksdl及ijkutils. 注:tag k0.3.1 player: remove ijkutil android相关 ...

  9. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

随机推荐

  1. 发工资了T_T

    和哈比一起吃的四人餐 望京很好很和谐

  2. 学习Go语言之模板方法模式

    模板方法模式结构图如下.原理是过程实现不一样,但是执行的顺序是按照模板固定好了的.即简单理解为都有1,2,3步骤,但是每一步的实现交由具体实现类不同实现. 1.过程式编程 // 模板方法模式 pack ...

  3. 【redis】redis命令集

    参考资料: http://www.cnblogs.com/woshimrf/p/5198361.html

  4. Unity 给FindGameObjectsWithTag排序

    GameObject[] patrol = GameObject.FindGameObjectsWithTag ("Player").OrderBy (g => g.tran ...

  5. android 选取部分 log 的两种方法

    Grep多个条件: android logcat -v time | grep -e A -e B 选取多个android log tag: android logcat -v time -s TAG ...

  6. HDU 4714 Tree2cycle(树型DP)

    解题思路: 将一棵树变成一个环.假设一个结点的分叉数目大于等于2.则将它与父节点断开.而且断开子结点数目sum - 2条边,并再次连接sum-2个儿子形成一条直链然后这条游离链与还有一条游离链相连,共 ...

  7. HBase的单节点集群详细启动步骤(分为Zookeeper自带还是外装)

    伪分布模式下,如(weekend110)hbase-env.sh配置文档中的HBASE_MANAGES_ZK的默认值是true,它表示HBase使用自身自带的Zookeeper实例.但是,该实例只能为 ...

  8. MySql免安装版绿化版安装配置,附MySQL服务无法启动解决方案

    整理于:https://www.cnblogs.com/cenwei/p/6249856.html      我下载的MySQL版本是:mysql-5.6.15-winx64 一.解压文件 下载好My ...

  9. MySQL Server 5.5.44免安装版配置详解

    转载地址:http://wenku.baidu.com/view/2a8bfe6a25c52cc58bd6beff.html### 一 下载MySQL http://dev.mysql.com/dow ...

  10. BZOJ 4430 Guessing Camels

    Description Jaap, Jan, and Thijs are on a trip to the desert after having attended the ACM ICPC Worl ...