如何在Kotlin中按字符'e'的出现频率对ArrayList进行特定排序?
按字符'e'的出现频率排序ArrayList的解决方法
嗨,我来帮你搞定这个排序需求!你遇到的问题是因为默认的Collections.sort()只会按照字符串的自然字典序排序,没法实现你要的按特定字符出现次数排序的逻辑。不过在Kotlin里,我们有很多灵活的方式来实现自定义排序,下面给你几种实用的方案:
1. 使用Kotlin扩展函数sortBy(修改原集合)
这是最简洁的方式,直接在原ArrayList上调用sortBy,传入一个lambda来计算每个字符串中'e'的出现次数:
// 初始化你的列表 val a = arrayListOf("eat", "animal", "internet") // 按'e'的出现次数升序排序 a.sortBy { str -> str.count { char -> char == 'e' } } // 现在a的内容就是:["animal", "eat", "internet"]
sortBy会直接修改原集合的顺序,非常高效。
2. 使用sortedBy生成新集合(不修改原列表)
如果你不想改动原来的ArrayList,想要生成一个全新的排序后的集合,可以用sortedBy,它会返回一个新的List,之后你可以转成ArrayList:
val originalList = arrayListOf("eat", "animal", "internet") // 生成排序后的新列表 val sortedList = ArrayList(originalList.sortedBy { it.count { it == 'e' } }) // sortedList的内容就是你想要的顺序
3. 兼容Java的Collections.sort方案(带自定义比较器)
如果你坚持想用Collections.sort,也可以通过传入自定义的Comparator来实现逻辑:
val a = arrayListOf("eat", "animal", "internet") Collections.sort(a) { s1, s2 -> // 分别计算两个字符串中'e'的数量 val eCount1 = s1.count { it == 'e' } val eCount2 = s2.count { it == 'e' } // 按数量升序比较 eCount1.compareTo(eCount2) }
额外补充:多条件排序
如果遇到两个字符串'e'的出现次数相同的情况,你还可以添加第二排序条件(比如按字符串字典序),用sortedWith和compareBy组合:
val sortedList = originalList.sortedWith(compareBy( { it.count { char -> char == 'e' } }, // 第一条件:'e'的数量升序 { it } // 第二条件:字符串字典序升序 ))
这样就能更精细地控制排序结果啦!
内容的提问来源于stack exchange,提问作者David Peter
相关产品推荐
相关产品推荐

