Scala排序列表[(String,Double)]



我正在尝试在Scala中对List[(String,Double(]进行排序,先是Double,然后是String。这意味着我希望List by首先按Double的大小排序,然后按字母顺序排列Strings。

例如,

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的大小然后按字母顺序。

您的代码几乎是正确的,但您需要按相反的顺序排序,并从高到低否定double:

sortThisList.sortBy(_._1).sortBy(-_._2)

这是因为Scala排序是稳定的,这意味着如果排序值相同,则值将保持相同的顺序。因此,第一个sortBy确保字符串是有序的,而第二个sortBy则按双精度排序(相反(。如果有多个记录具有相同的双值,则它们仍按字符串值排序。

然而,这可以使用sortBy:在单个操作中完成

sortThisList.sortBy(e => (-e._2, e._1))

这是通过按优先级顺序提取字段并按该值排序来实现的。

想明白了。

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

您的问题是由一个拼写错误引起的:

val sortThisList = List[("C", 2.0), ("B", 1.0), ("A", 1.0), ("B", 2.0), ("A", 2.0), ("C", 1.0)]

这行不通。您要做的是传递六个类型参数,它们是成对的文字类型。您可能希望传递值参数。在Scala中,就像几乎所有编程语言一样(是的,我知道有Rebol(,值参数是用圆括号传递的,而不是方括号。

最新更新