2012-12-03 24 views
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) 

我想排序。我能怎么做?先谢谢你。

+0

是内部列表总是对的字符串和一个int的?那么你应该使用一个元组列表而不是列表列表来使它类型安全:'val list = List((“”b“,50),(”a“,25),(”i“,60)) ' – Jesper

回答

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)) 
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排序由第二元件进行排序。