Android开发-关于排序问题

想要对接口返回的列表数据进行自定义排序

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值