想要对接口返回的列表数据进行自定义排序
1.按时间排序
Collections.sort(currentList, (lhs, rhs) -> {
if (lhs == rhs) {
return 0;
}
Date date1 = TimeUtils.millis2Date(lhs.getAppInstallDate());
Date date2 = TimeUtils.millis2Date(rhs.getAppInstallDate());
// 对日期字段进行升序,如果欲降序可采用after方法
if (date1.before(date2)) {
return 1;
}
return -1;
});
2.按名称首字母排序
private void nameScreen() {
Collections.sort(currentList, new Comparator<InfoModel>() {
final Collator cmp = Collator.getInstance(Locale.getDefault());
@Override
public int compare(InfoModel lhs, InfoModel rhs) {
String apkName1 = lhs.getAppLabel();
String apkName2 = rhs.getAppLabel();
// 获取字符串的首字符或汉字的首字符(Unicode编码比较)
char c1 = getSortChar(apkName1);
char c2 = getSortChar(apkName2);
return cmp.compare(String.valueOf(c1), String.valueOf(c2));
}
});
}
private char getSortChar(String s) {
char firstChar = s.charAt(0);
boolean isEnglish = String.valueOf(firstChar).matches("[a-zA-Z]");
if (isEnglish) {
return Character.toLowerCase(firstChar);
} else {
// 汉字获取拼音的首字母
return PinyinUtils.getPinyinFirstLetter(s).charAt(0);
}
}
3.关于kotlin排序
Kotlin的数组排序方法有sort, sorted, sortBy, sortedBy, sortWith, sortedWith
从返回值来分类:sort, sortBy, sortWith
没有返回值,排序完之后会改变原有的数组sorted, sortedBy, sortedWith
则不会改变原有的数组,而是直接返回一个排序完之后的数组
从参数来分类:sort, sorted
不能传参,而且只适用于基本数据类型的数组,如果是new的对象,则无法使用。排序的话是按照递增排序的sortBy, sortedBy
传入数组的某个元素或者对象的某个属性值,然后按照该变量的值进行递增排序sortWith, sortedWith
传入一个comparator,可以自定义排序规则,适用于多要素排序
4.kotlin代码示例
主要记录下sortWith
sortBy只能指定一个属性参与排序,并且此属性对象必须已经实现了Comparable接口,通过调用该接口的compare方法进行排序,而使用sortWith则可以指定多个属性参与排序,属性不需要实现Comparable接口,可以自己定制排序的逻辑。
fun main() {
val user1 = User("1", false)
val user2 = User("2", false)
val user3 = User("3", true)
val user4 = User("4", true)
val userList = mutableListOf(user2, user1, user4, user3)
println("排序前:")
userList.forEach(::println)
userList.sortWith(kotlin.Comparator { u1, u2 ->
if (u1.isOnline != u2.isOnline) {
u2.isOnline.compareTo(u1.isOnline) // 状态以降序排序
} else {
u1.name.compareTo(u2.name) // 名字以升序排序
}
})
println("排序后:")
userList.forEach(::println)
}
//排序前:
//User(name=2, isOnline=false)
//User(name=1, isOnline=false)
//User(name=4, isOnline=true)
//User(name=3, isOnline=true)
//排序后:
//User(name=3, isOnline=true)
//User(name=4, isOnline=true)
//User(name=1, isOnline=false)
//User(name=2, isOnline=false)