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

如何在Scala中按值降序、键升序对Map的键排序?

Scala实现Map键的双条件排序

需求是提取Map的键,先按值降序排序,值相同时按键升序排序。你之前用sortWith的写法逻辑有误,导致结果不符合预期,下面给出两种正确实现方式:

方式一:使用sortWith分支判断

调整判断逻辑,先比较值的大小,值不同时按降序排;值相同时再比较键的升序:

val m = Map("aaa" -> 3, "bbb" -> 7, "zzz" -> 3, "hhh" -> 9, "ggg" -> 10, "ccc" -> 3)
val result = m.toSeq.sortWith { (x, y) =>
  if (x._2 != y._2) x._2 > y._2  // 值不同,降序排列
  else x._1 < y._1               // 值相同,键升序排列
}.map(_._1)
// 输出结果:List(ggg, hhh, bbb, aaa, ccc, zzz)

方式二:使用sortBy(更简洁推荐)

sortBy支持通过元组指定多维度排序规则,元组会按顺序依次比较。我们可以用(-值, 键)作为排序依据:取负值把值的降序转成sortBy默认的升序逻辑,同时保留键的升序规则:

val m = Map("aaa" -> 3, "bbb" -> 7, "zzz" -> 3, "hhh" -> 9, "ggg" -> 10, "ccc" -> 3)
val result = m.toSeq.sortBy(t => (-t._2, t._1)).map(_._1)
// 输出结果:List(ggg, hhh, bbb, aaa, ccc, zzz)

你之前错误的原因在于sortWith里的逻辑x._2 > y._2 && x._1 < y._1,这个逻辑只有当x的值大于y且x的键小于y时才返回true,完全不符合需求逻辑——我们需要的是“优先按值降序,值相等时按键升序”,所以必须用分支判断或者sortBy的元组方式来实现。

内容的提问来源于stack exchange,提问作者Dariusz Krynicki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:05:57