2014-11-08 1 views
1

-스칼라를 사용하여 목록에서 별도의 목록을 만드는 방법은 무엇입니까? 나는 목록 다음 한

List((name1,A1,176980), (name2,A2,0), (name3,A3,1948), (name4,A4,95676)) 

목록 위에서 나는 각각에서 element1, element2에와 element3 같은 -리스트 요소의 별도의 목록을 만들려고합니다.

List(name1,name2,name3,name4) 

List(A1,A2,A3,A4) 

List(176980,0,1948,95676) 

같은 -

내가 원하는 별도의 목록을 어떻게 스칼라를 사용하여 목록 위 얻을 ???

답변

3

나이브 솔루션 :

val list = List(
    ("name1","A1",176980), 
    ("name2","A20",0), 
    ("name3","A3",1948), 
    ("name4","A4",95676)) 

list.map(_._1)  
list.map(_._2)  
list.map(_._3)  

일부 일반화 버전 :

def key(products: List[Product], num: Int) = { 
    products.map(_.productElement(num)) 
} 

key(list, 0) // res3: List[Any] = List(name1, name2, name3, name4) 
key(list, 1) // res4: List[Any] = List(A1, A20, A3, A4) 
key(list, 2) // res5: List[Any] = List(176980, 0, 1948, 95676) 

심지어 어떤 인수에 대응 제품에 대한이 :

def key(products: List[Product], num: Int) = { 
    products.map { p => 
    Option(p) 
     .filter(_.productArity > num) 
     .map(_.productElement(num)) 
     .getOrElse(None) 
    } 
} 
1
scala> List(("name1","A1",176980), ("name2","A2",0), ("name3","A3",1948)) 
res9: List[(String, String, Int)] = List((name1,A1,176980), (name2,A2,0), (name3,A3,1948)) 

scala> res9.map(_._1) 
res10: List[String] = List(name1, name2, name3) 

scala> res9.map(_._2) 
res11: List[String] = List(A1, A2, A3) 

scala> res9.map(_._3) 
res12: List[Int] = List(176980, 0, 1948) 
6

당신은 항상 3이있는 경우 튜플에는 표준 방법이 있습니다.

scala> list.unzip3 
res1: (List[String], List[String], List[Int]) = 
(List(name1, name2, name3, name4),List(A1, A20, A3, A4),List(176980, 0, 1948, 95676)) 

2 튜플의 경우 unzip도 있습니다.