2015-09-17 2 views
2

У меня есть следующие входные данныеScala - карта значения GroupBy в список

((A, 1, 4), (A, 2, 5), (A, 3, 6)) 

Я хотел бы, чтобы произвести следующий результат

(A, (1, 2, 3), (4, 5, 6)) 

через группирования вход по ключам

Что бы правильный способ сделать это в Scala?

+3

Не могли бы вы быть более конкретными относительно типов, которые вы ожидаете? Что такое 'A 1 4'? Индивидуальные строки? Строка и два целых числа? –

+0

Это список (A, 1, 4) – ZhongBot

+0

Что вы пробовали? У вас есть действующий пример, над которым вы работали, и который не возвращает желаемый результат? – bedwyr

ответ

5

((А, 1, 4), (А, 2, 5), (А, 3, 6))

В том случае, что это представляет собой List[(String, Int, Int)] тип, то попробуйте следующее ,

val l = List(("A", 1, 4), ("A", 2, 5), ("A", 3, 6), ("B", 1, 4), ("B", 2, 5), ("B", 3, 6)) 

l groupBy {_._1} map { 
    case (k, v) => (k, v map { 
     case (k, v1, v2) => (v1, v2) 
    } unzip) 
} 

Это приведет к Map[String,(List[Int], List[Int])], т.е., карта со строковыми ключами отображаются в кортежах двух списков.

Карта (A -> (Список (1, 2, 3), Список (4, 5, 6)), B -> (Список (1, 2, 3), Список (4, 5, 6)))

0

Попробуйте что-то вроде этого:

def takeHeads[A](lists:List[List[A]]): (List[A], List[List[A]]) = 
    (lists.map(_.head), lists.map(_.tail)) 

def translate[A](lists:List[List[A]]): List[List[A]] = 
    if (lists.flatten.isEmpty) Nil else { 
    val t = takeHeads(lists) 
    t._1 :: translate(t._2) 
    } 

yourValue.groupBy(_.head).mapValues(v => translate(v.map(_.tail))) 

Это производит Map [Любой, любой] при использовании на вашем значении ... но это должно заставить вас идти в правильном направлении.

Смежные вопросы