2015-03-26 3 views
0

Предположим, у меня есть List[Map[String, String]], который представляет таблицу в базе данных и List[String], которая представляет список имен столбцов. Я хотел бы реализовать эквивалент пункта group by в SQL запроса:Как реализовать динамическую группу в scala?

def fun(table:List[Map[String, String]], keys:List[String]): List[List[Map[String, String]] 

Например:

val table = List(
    Map("name"->"jade", "job"->"driver", "sex"->"male"), 
    Map("name"->"mike", "job"->"police", "sex"->"female"), 
    Map("name"->"jane", "job"->"clerk", "sex"->"female"), 
    Map("name"->"smith", "job"->"driver", "sex"->"male") 
) 

val keys = List("job", "sex") 

fun(table,keys) И тогда должно быть:

List(
    List(
     Map("name"->"jade", "job"->"driver", "sex"->"male"), 
     Map("name"->"smith", "job"->"driver", "sex"->"male") 
    ), 
    List(Map("name"->"mike", "job"->"police", "sex"->"female")), 
    List(Map("name"->"jane", "job"->"clerk", "sex"->"female")) 
) 
+0

типы в определении функции не являются реальными типами. Можете ли вы привести несколько примеров, чтобы уточнить? –

+0

удалите опечатку и укажите пример. –

+0

Что вы пробовали? Вы должны действительно работать над тем, чтобы ваши вопросы были яснее и без ошибок. –

ответ

1

Вы ищете для groupBy:

table.groupBy(row => keys.map(key => row(key))) map { 
    case (group, values) => values 
} 

Или более кратко:

table.groupBy(keys.map(_)).map(_._2) 
+0

Я знаю функцию groupBy раньше, но я не могу понять, что это можно решить таким образом. Решение настолько изящно, много спасибо –

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