我正在尝试在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(,值参数是用圆括号传递的,而不是方括号。