![](/img/trans.png)
[英]How to sort a map in scala where the key is List[Double] and the value is double. And I wanna sort with double?
[英]Scala Sort List[(String, Double)]
我正在尝试在 Scala 中首先通过 Double 和 String 对 List[(String, Double)] 进行排序。 这意味着我希望 List by 首先按 Double 的大小排序,然后按字母顺序排序。
例如,
val sortThisList = List[("C", 2.0), ("B", 1.0), ("A", 1.0), ("B", 2.0), ("A", 2.0), ("C", 1.0)]
sortThisList 排序后应如下所示:
List[("A", 2.0), ("B", 2.0), ("C", 2.0), ("A", 1.0), ("B", 1.0), ("C", 1.0)]
我曾尝试使用 sortBy 函数:
val sortedList = sortThisList.sortBy(_._2).sortBy(_._1)
这是我尝试使用 sortBy 和 sortWith 进行编译的唯一版本。 但是,它只会生成按字母顺序排序的 sortedList 版本,而不是按 Double 的大小然后按字母顺序排序。
您的代码几乎是正确的,但您需要以相反的顺序排序并否定双倍以从高到低排序:
sortThisList.sortBy(_._1).sortBy(-_._2)
这是有效的,因为 Scala 排序是稳定的,这意味着如果排序值相同,则值保持相同的顺序。 所以第一个sortBy
确保字符串有序,第二个sortBy
按双sortBy
排序(相反)。 如果有多个记录具有相同的双精度值,它们仍按字符串值排序。
但是,这可以使用sortBy
在单个操作中sortBy
:
sortThisList.sortBy(e => (-e._2, e._1))
这是通过按优先级顺序提取字段并按该值排序来实现的。
您的问题是由拼写错误引起的:
val sortThisList = List[("C", 2.0), ("B", 1.0), ("A", 1.0), ("B", 2.0), ("A", 2.0), ("C", 1.0)]
这行不通。 您正在做的是传递六个类型参数,它们是文字类型对。 您可能想要传递值参数。 在 Scala 中,就像在几乎所有编程语言中一样(是的,我知道,有 Rebol),值参数在圆括号中传递,而不是在方括号中。
弄清楚了。
val listByValue = sortThisList.groupBy { case (key, value) => value }.toSeq
val listByValue = listByValue.sortBy { case (value, group) => value }
val sortedList = listByValue.flatMap { case (key, value) => value.sortBy { case (key, value) => value } }.reverse.toList
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.