このようにリストをソートしようとすることは、本質的に安全ではありません。コンパイラは、内部リストの要素が正しい型を持っていることを保証できないからです。おそらく、これを達成するための最も安全な方法はmatch
、特定の要素を変換するために a を使用し、データが本来あるべきものではないという例外を発生させることです。
list.sortBy(x =>
x(0) match {
case s: String => s
case _ => sys.error("not a string")
})
//> res0: List[List[Any]] = List(List(a, 25), List(b, 50), List(i, 60))
list.sortBy(x =>
x(1) match {
case i: Int => i
case _ => sys.error("not an integer")
})
//> res1: List[List[Any]] = List(List(a, 25), List(b, 50), List(i, 60))
そうは言っても、本当に(String, Int)
必要なのはタプルのリストのようです。そうすれば、コンパイラは安全性を保証できます。
val list2 = List(("b", 50), ("a", 25), ("i", 60))
//> list2 : List[(java.lang.String, Int)] = List((b,50), (a,25), (i,60))
コンパイラは内部要素の型を認識していることに注意してください。したがって、ソートははるかに簡単で安全です:
list2.sortBy(_._1)
//> res2: List[(java.lang.String, Int)] = List((a,25), (b,50), (i,60))
list2.sortBy(_._2)
//> res3: List[(java.lang.String, Int)] = List((a,25), (b,50), (i,60))