(1)使用Comparator对文件进行排序(文件名字的升序、降序,创建时间的升序、降序)
1.文件详情的类
public class FileListResult {
private String id;
private String fileName;
private String createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}
2.Comparator的实现类
private static class MyComparator implements Comparator<FileListResult>{
int sortMode;
public MyComparator(int sortMode) {
this.sortMode=sortMode;
}
/**
* @param o1 参与比较的list中的前一个元素
* @param o2 参与比较的list中的后一个元素
* @return 对象o1的属性与对象o2的属性相减(o1-o2)代表list升序排列,
* 如(o1==o2、返回值为0,o1>o2、返回值为正数,o1<o2、返回值为负数);
* 反之,则降序排列
*/
@Override
public int compare(FileListResult o1, FileListResult o2) {
switch (sortMode) {
case 0:
return cmpName(o1.getFileName(), o2.getFileName());
case 1:
return cmpTime(o1.getCreateTime(), o2.getCreateTime());
}
return 0;
}
/**
* 文件名字的升序
*/
private int cmpName(String s1,String s2){
if (s1==null||s2==null){
return 0;
}
int len1=s1.length();
int len2=s2.length();
int lenMin=Math.min(len1,len2);
for (int i = 0; i < lenMin; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return len1-len2;
}
/**
*时间的升序
*/
private int cmpTime(String s1,String s2){
if (s1==null||s2==null){
return 0;
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
long time1 = df.parse(s1).getTime();
long time2 = df.parse(s2).getTime();
return (int) (time1-time2);
} catch (ParseException e) {
return 0;
}
}
}
3.MyComparator的使用
List<FileListResult> fileList = new ArrayList<>();
Comparator comparator=new MyComparator(0);
Collections.sort(fileList, comparator);//文件名字的升序排列
//文件名字的升序排列
Arrays.sort(((ArrayList) fileList).elementData, 0, fileList.size(), comparator);
//文件名字的降序排列
Collections.sort(fileList, Collections.reverseOrder(comparator));
(2)Comparable的使用
1.类的声明
public class FileListResult implements Comparable {
private String id;
private String fileName;
private String createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
/**
*文件名称升序
*/
@Override
public int compareTo(@NonNull Object o) {
if (o!=null){
if (o instanceof FileListResult){
return getFileName().compareToIgnoreCase(((FileListResult) o).getFileName());
}else {
return 0;//不进行排序
}
}else {
return 0;
}
}
}
2.类的引用
Collections.sort(fileList);//文件名称升序
(3)Comparator和Comparable的区别
Comparator:接口的实现类作为独立的一个类存在,能同时自定义多种字段(名字、时间)的排序和排序的逆转(升序与降序的转换);
Comparable:只能定义单一字段的比较。
(4)总结
Comparator对list的排序归根结底是对其中的元素按照数字类型的值进行排序。