列出任何类型的排序

时间:2012-12-03 09:47:01

标签: scala

我有一份清单。但类型是任何。

// 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)

我想排序。我能怎么做?提前谢谢。

2 个答案:

答案 0 :(得分:6)

尝试对这样的列表进行排序本质上是不安全的,因为编译器无法保证内部列表的元素具有正确的类型。也许最安全的方法是使用match转换特定元素,并引发异常是数据不应该是什么。

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))

答案 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按第二个元素排序。