2013-08-28 2 views
1

groupBy을 사용하여 튜플 목록을 Map으로 변환하는 방법을 찾으려고합니다. 하여 책을스칼라에서 중복을 피하기 위해 List [Tuple2 [X, Y]]를 Map [X, List [Y]]로 변환하는 방법?

val results: List[(Author, Book)] = getAuthorAndBook() 

는 저자가 많은 책을 쓴 수 있기 때문에, 나는이 목록에있는 다른 책과 같은 저자가있을 수 있습니다 그래서 그룹 싶습니다의 내가 DB에서 목록이 방법을 검색하고 있다고 가정 해 봅시다 저자 [Author, List [Book]]가 있어야합니다.

어떻게하면됩니까?

은 내가 그룹에 있지만 그 후, 내가 어떤 도움을 주시면 감사하겠습니다 도서

results.groupBy(_._1) // and then what ? 

처리하는 방법을 아주 확실하지 않다 알고있다.

들 덕분에

답변

2

당신이 할 수있는 :

results.groupBy(_._1).mapValues(_.map(_._2)) 

GROUPBY 원하는 키 맵을 생성하지만 값이 여전히있는 키가, 그들이 목록은 [(X, Y)] List [Y] 대신에. mapValues ​​호출은이를 수정합니다.

+0

감사합니다. :) REPL은 확실히 내 친구입니다. – kaffein

-1

Tuple2의 목록을 위해이 기능을하는 빌드 인 기능이 있습니다.

val list = List((1,"toto") , (2,"test")) 
list: List[(Int, java.lang.String)] = List((1,toto), (2,test)) 

list.toMap 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,toto), (2,test)) 

당신은 wingedsubmariner가 제안한 것을 필요로하지 않습니다. 이미 처리되었습니다.

+0

저자가 두 권 이상의 책을 쓴다면 제대로 작동하지 않습니다. 값은 각 튜플의 두 번째 항목의 목록이어야합니다 .'val list = List ((1, "toto"), (2, "test"), (2, "wibble")); // 목록 : List [(Int, String)] = 목록 ((1, toto), (2, 테스트), (2, wibble)) val r = list.toMap; {0, 1 -> toto, 2 -> wibble)' –

+0

맞아, 미안해, Map [Int, String]'이 아니라 Map [Int, List [String]]' –