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. 888E - Maximum Subsequence 中途相遇法

    Code: #include<cstdio> #include<algorithm> #include<cstring> #include<string> ...

  2. 为什么 linux 上不能用 localhost 链接数据库?

         因为 linux 连接的时候不是通过 tcp 协议,而是通过 sockect 来连接.所以 写localhost 之后就会默认去找 sockect 链接[此文件在 /var/lib/mysq ...

  3. Linux Shell脚本编程-函数

    函数介绍  定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数:  功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程.  注意: ...

  4. 一次AIX LVM PV重复PVID故障处理记录

    故障背景:客户需要把AIX 5.3.10上的一些VG做两台存储之间的LVM级别的Mirror,存储使用的是两台EMC DMX3,但是由于两套SAN存储之前是使用EMC的软件做存储级别的Mirror,所 ...

  5. springboot框架笔记——springboot提供的自动配置

    Springboot基本配置 spring MVC的定制配置需要我们的配置实现一个WebMvcConfigurer接口,如果实在spring环境下需要使用@EnableWebMVC注解,来开启对spr ...

  6. Java基础学习总结(13)——流IO

    一.JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文件里面存放着各种各样的数据,我们 ...

  7. Ehcache整合spring配置,配置springMVC缓存

    为了提高系统的运行效率,引入缓存机制,减少数据库访问和磁盘IO.下面说明一下ehcache和spring整合配置. 1.   需要的jar包 slf4j-api-1.6.1.jar ehcache-c ...

  8. 1.cocos_helloworld

    在class HelloWorld : public cocos2d::Layer中添加函数 void menuclose(cocos2d::Ref *psender); 实现: void Hello ...

  9. Container详解

    Container是一个拥有绘制.定位.调整大小的widget. padding和margin padding和margin分别设置Container的内边距和外边距.可取值包括下面四个: EdgeI ...

  10. css3 边框阴影效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...