声明:本人只是一个Android的初级学习者,所以不免导致文章的深度、内涵欠缺,一些实现的思想方法比较初级,还请见谅,并请多多指正
目录
1.文件排序简单的思想(List+Map)
2. 缓存文件排序规则
3. 问题+解决思路
1.文件排序简单的思想(List+Map)
假设app需要展示一组excel文件,其默认顺序是杂乱无章的,在此我根据文件名(中文或者英文)排序、创建时间排序作为讲解
1.1 文件名排序
文件名可能由中文、英文、_组成,对于英文字符串排序相比于过于简单,此处不再过多赘述,主要来讲解中文字符串排序。首先对于中文字符串排序,java中提供如下方式:
Comparator<Object> com=Collator.getInstance(java.util.Locale.CHINA);
通过Collator指定具体的语言环境构造一个Collator对象,即Comparator的一个实现类对象,接下来我们获取到所有需要排序的文件名,把保存到数组或者list列表中,分别调用一下方法实现中文排序:
//array
Arrays.sort(array, com);
//list
Collections.sort(array, com);
1.2 创建时间排序
首先如果创建时间如果是已经格式化好的标准2019/5/2 12:00:00等等这种形式的字符串,完全可以使用上诉的中文排序的方式完成排序,如果你的创建时间是时间戳的形式,我们可以通过将时间戳格式化为标准的日期时间格式,然后转换为中文字符串比较:
new SimpleDataFormat("yyyy/MM/dd HH:mm:ss").format("时间戳")
或者直接通过比较时间戳的方式来进行排序
1.3 排序的继续实现
由于我们在App中展示文件列表,都是通过向服务器后台请求返回的json字符串,然后进行解析映射成我们封装好的一个文件对象(解析json强烈推荐Gson),这个文件对象中可能会包含文件名、创建时间、更新时间、类型、创建人等属性,假设此处我们要根据文件名进行排序,我们要从众多的文件对象中把文件名取出来放到一个List列表中(数组也可以):
List<String> fileNameList = new ArrayList<>();
fileNameList.add("文件名");
fileNameList.add("文件名");
fileNameList.add("文件名");
...
接下来我们新建一个map,这个map对象的key、value分别对应文件的文件名、文件对象,对所有的文件对象进行存储,每一个文件名对应一个文件对象,此处一定要注意,map对于不允许有重复的key值,若存在相同则会进行覆盖,由于此处我们使用的文件名进行的排序,文件名肯定不会相同,而如果我们根据创建时间、更新时间排序,创建或者更新时间就可能会相同,如果我们直接放入map的key中则可能会发生覆盖,所以我们可以将创建或者更新时间相同的对象都放入到一个list中,然后再把这个list存入到map的value,与key更新或者创建时间一一映射:
//map中key不会重复时,如文件名
Map<String, FileInfo> map;
map.put("fileName", "FileInfo")
//map 中key会发生重复,如文件的创建时间
List<FIleInfo> list;
list.add("存放创建时间相同的文件对象FileInfo");
list.add("存放创建时间相同的文件对象FileInfo");
list.add("存放创建时间相同的文件对象FileInfo");
...
Map<String, List<FileInfo>> map;
map.put("CreateTime Or UpdateTime", list);
当我们在对文件名的fileNameList进行中文排序完之后,此时该列表中的文件名都是按照有序方式进行排序的,然后我们依次遍历该列表取出文件名,然后通过文件名作为key,到我们之间存放的map中,将对应的value取出,即文件对象,并且将value依次放入到一个新建的专门存放文件对象的列表中fileList,当我们遍历完fileNameList,此时fileList中存放的文件对象的次序就是按照文件名排序好的文件对象
List<FileInfo> fileList;
for (int i = 0; i < fileNameList.size(); i++) {
fileList.addAll(map.get(fileNameList.get(i)));
}
2. 缓存文件排序规则
假设我们现在想在展示文件的页面跳转到其他界面,然后再返回到展示文件的页面,则之间我们设置的文件排序会失效,所有的文件重新变得杂乱无章显示在屏幕上,这个效果就不是我们想要的结果
我们可以在进行设置文件排序后,将排序的依据方式以及是升序还是降序以约定好的数字表示保存到SharedPreference中,然后在我们重新跳转到文件展示的页面中时,读取SharedPreference里面的信息,若是信息不存在,则代表我们之间并没有进行文件的排序,那就默认显示即可;如果信息存在,则按照信息的排序规则将当前页面的文件进行重新排序
3. 问题+解决思路
- 进行文件排序时,如果依据创建或者更新时间进行排序,我们不仅仅需要文件排序,还需要将时间判断是不是今天、昨天、前天,然后格式化输出打印,比如:今天:1:05代替2019/7/28 1:05,具体实现思路:
首先获取到今天凌晨00:00:00的时间戳,
new SimpleDataFormat().parse("需要转化为时间戳的今天日期").getTime();
在此处获得今天时间戳的基础上,分别减去86400000、86400000*2得到昨天、前天的时间戳,然后根据这三个时间戳值与文件的创建或者更新时间戳比较即可