如何在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
相关产品推荐
相关产品推荐

