3

リストがあります。しかし、タイプは任意です。

// list: List[List[Any]] = List(List(b, 50), List(a, 25), List(i, 60))
val list = List( List("b", 50), List("a", 25), List("i", 60))


// sort should be list(0)(0) "String" sort
("a", 25), ("b", 50), ("i", 60)

// or  list(0)(1) "Integer" sort
("a", 25), ("b", 50), ("i", 60)

並べ替えたいです。どのようにできるのか?前もって感謝します。

4

2 に答える 2

6

このようにリストをソートしようとすることは、本質的に安全ではありません。コンパイラは、内部リストの要素が正しい型を持っていることを保証できないからです。おそらく、これを達成するための最も安全な方法は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))
于 2012-12-03T10:07:43.697 に答える
2

1 番目と 2 番目の要素で並べ替えるには、次のようにします。

scala> list.sortBy{
     |   case (s: String) :: (i: Int) :: Nil => s -> i
     |   case _ => sys.error("error")
     | }
res0: List[List[Any]] = List(List(a, 25), List(b, 50), List(i, 60))

を使用case (s: String) :: _ => sして、最初の要素case _ :: (i: Int) :: _ => iで並べ替えたり、2 番目の要素で並べ替えたりできます。

于 2012-12-03T10:07:40.757 に答える