咨询Swift sorted(by:)的Kotlin等效实现,使用sortedBy遇阻
把Swift的
sorted(by:)转成Kotlin的正确写法 我明白你想把这段Swift排序逻辑移植到Kotlin里,之前用sortedBy()遇到问题大概率是没完全匹配Swift代码里的自定义比较逻辑——咱们一步步来拆解和转换:
首先先回顾你的Swift代码核心逻辑:
- 对
tests数组排序 - 每个元素先通过
getDisplayName()获取展示名称 - 将名称转为每个单词首字母大写的格式
- 比较两个处理后的名称,按升序排列
方法1:用sortedBy()(最简洁,匹配核心逻辑)
Kotlin的sortedBy()接受一个Lambda来提取排序的key,然后自动按key的自然顺序升序排列,完全对应你Swift代码的需求:
// 先定义一个扩展函数,完全匹配Swift的capitalized效果(每个单词首字母大写) fun String.capitalized(): String { return split(" ").joinToString(" ") { word -> word.replaceFirstChar(Char::uppercase) + word.drop(1).lowercase() } } // 最终排序代码 val sortedArray = tests.sortedBy { test -> getDisplayName(test).capitalized() }
如果你的需求只是简单的全大写(而非每个单词首字母大写),可以直接用Kotlin内置的uppercase()简化:
val sortedArray = tests.sortedBy { getDisplayName(it).uppercase() }
方法2:用sortedWith()(完全对应Swift的sorted(by:)写法)
如果你更习惯像Swift那样自定义比较逻辑,Kotlin的sortedWith()接受一个Comparator(或简化Lambda),返回值直接定义元素顺序:
// 同样先定义capitalized扩展函数(如果需要) fun String.capitalized(): String { return split(" ").joinToString(" ") { word -> word.replaceFirstChar(Char::uppercase) + word.drop(1).lowercase() } } // 自定义比较逻辑,和Swift写法高度对齐 val sortedArray = tests.sortedWith { lhs, rhs -> val lhsDisplayName = getDisplayName(lhs).capitalized() val rhsDisplayName = getDisplayName(rhs).capitalized() // compareTo返回负数=lhs排在前面,正数=rhs排在前面,0=两者相等 lhsDisplayName.compareTo(rhsDisplayName) }
为什么之前用sortedBy()可能出错?
- 你可能没处理名称的大写转换,导致排序基于原始名称的顺序,和Swift逻辑不一致
- Kotlin原生的
capitalize()方法在1.5+版本已被废弃,直接使用会报错,需要用上面的扩展函数或replaceFirstChar实现类似Swiftcapitalized的效果
内容的提问来源于stack exchange,提问作者TheLosingEdge
相关产品推荐
相关产品推荐

