Kotlin中如何实现对象数组先按字母排序再按数字排序
解决方法
你需要自定义排序规则,首先区分「字母开头」和「数字开头」的元素,把字母开头的优先级设为更高,再在同分类下按名称排序,替换原来的sortedBy为sortedWith实现多规则排序即可。
调整后的排序代码如下:
val allDrinks = DrinkData.generateAllDrinks().sortedWith(compareBy<Drink> { // 第一层规则:字母开头排在前,数字开头排在后 !it.theDrinkName.first().isLetter() }.thenBy { // 第二层规则:同分类下按名称不区分大小写排序 it.theDrinkName.lowercase() }).toTypedArray()
逻辑说明
- 第一层排序规则中,
!it.theDrinkName.first().isLetter()的返回值:字母开头的元素返回false(对应排序权重0),数字开头的元素返回true(对应排序权重1),权重越小排序越靠前,自然实现字母在前、数字在后的效果。 - 第二层排序规则统一把名称转小写后排序,字母组会按a-z顺序不区分大小写排列,数字组会按字符串自然顺序排序,完全匹配你需要的输出结果。
运行后输出和你预期的一致:
Gin rum Vodka 151 99
注:原代码中使用的
toLowerCase方法已在新版Kotlin中废弃,推荐使用lowercase()方法替代。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

