我想這樣排序,但出現錯誤。我們如何改進?
enter code here
如果鍵中包含的整數是
如果為 1,按名稱排序 (Ordering.String)
如果為 2,則以最高英語分數排序 (Ordering.Int.reverse)
如果為 3,則以最高數學分數排序 (Ordering.Int.reverse)
如果為 4,則以最高科學分數排序 (Ordering.Int.reverse)
如果 5,按考試日期排序(從舊到新)enter code here
排序方式。任何其他數字 (1-5) 都將被忽略。
如果指定了多個鍵,則從 Seq 的開頭開始按順序進行比較。
如果 kesy 為空,則不排序回傳。
此外,如果每個專案都有一個減號,它會以相反的順序排序。
如果在鍵中多次指定相同的數字,則忽略第二個和后續指定。
例如,Seq(-10, 5, 4, 0, -1, 2, 5, 1) 被視為 Seq(5, 4, -1, 2)。
示例)如果鍵是 Seq(-5, 1, 2, 3, 4):
按日期的降序比較,如果相同,按名稱排序,如果相同,按英語、數學和科學的最高分排序。
object OptionAnswer {
case class Score(
name: String,
english: Int,
math: Int,
science: Int,
date: LocalDate
)
def main(args: Array[String]): Unit = {
val scoreOfAlice = Score(name = "Alice", english = 77, math = 74, science = 26, date = LocalDate.of(2020, 1, 30))
val scoreOfBob = Score(name = "Bob", english = 100, math = 74, science = 14, date = LocalDate.of(2020, 1, 26))
val scoreOfCharlie = Score(name = "Charlie", english = 100, math = 74, science = 99, date = LocalDate.of(2020, 1, 26))
val scoreOfDave = Score(name = "Dave", english = 50, math = 81, science = 88, date = LocalDate.of(2020, 1, 30))
val scoreSeq: Seq[Score] = List(scoreOfAlice,scoreOfBob,scoreOfCharlie,scoreOfDave)
val keys = Seq(-5, 1, 2, 3, 4)
println(sortScore(scoreSeq, keys))
}
def sortScore(scoreSeq: Seq[Score], keys: Seq[Int]): Seq[Score] = {
val keys_set = keys.toSet
keys_set match{
case 1 => scoreSeq.sortBy(score => score.name)
case 2 => scores.sortBy(score => -score.english)
case 3 => scores.sortBy(score => -score.math)
case 4 => scores.sortBy(score => -score.science)
case -1 => scoreSeq.sortBy(score => -score.name)
case -2 => scores.sortBy(score => score.english)
case -3 => scores.sortBy(score => score.math)
case -4 => scores.sortBy(score => score.science)
case _ => score
}
uj5u.com熱心網友回復:
您需要首先撰寫按單個鍵排序的函式:
def sortByKey(scores: Seq[Score], key: Int): Seq[Score] = {
val res = math.abs(key) match {
case 1 => scores.sortBy(_.name)
case 2 => scores.sortBy(-_.english)
case 3 => scores.sortBy(-_.math)
case 4 => scores.sortBy(-_.science)
case _ => scores
}
if (key < 0) {
res.reverse
} else {
res
}
}
然后您可以使用foldLeft
將排序應用于鍵串列:
def sortScores(scores: Seq[Score], keys: Seq[Int]): Seq[Score] =
keys.distinct.reverse.foldLeft(scores)(sortByKey)
關鍵是distinct
洗掉重復項,reverse
因為最重要的關鍵是最后應用的關鍵。
另一種方法是使用鍵串列來創建一個復雜的排序函式,但我會讓其他人來撰寫該解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524172.html
標籤:斯卡拉