You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:42:34