2014-11-22 3 views
0

Мне нужно подсчитать вхождения элементов в список.Подсчет элементов элементов без .groupBy

Список выглядит следующим образом: List[(String, String, Int)] - список (String, String, Int) кортежи.

Пример:

List(("Gregor", "Math", 6), ("Mark", "Math", 33), 
    ("Gregor", "IT", 44), ("Jane", "Math", 3), 
    ("Mark", "Geography", 44), ("Gregor", "sdf", 32)) 

И мне нужно, чтобы вернуть список пар (имя, вхождений в списке) Для этого примера следует

List(("Gregor", 3), ("Mark", 2), ("Jane", 1)) 

Я попытался с картой и foldLeft, но я не имею идеи, как я могу это сделать

+0

Посмотрите на 'функции groupBy'? –

+0

Я могу использовать только карту, foldleft, foldright и фильтр для этой задачи. – akcza

+0

Так что это домашнее задание? Что вы пробовали? –

ответ

0
users.groupBy(u => u._1).map(u => (u._1, u._2.length)).toList 
+0

'groupBy' не может быть использован, это была моя первая мысль. –

+0

Hm. Странное ограничение, но хорошо, я подумаю. Любые другие ограничения? – Dmitri

+0

Проверьте комментарии к вопросу, он сказал, что нам разрешено использовать 'foldLeft',' foldRight', 'map' и' filter'. Очевидно, это вопрос домашней работы, но, тем не менее, забава. –

0
scala> val list = List(("Gregor", "Math", 6), ("Mark", "Mat", 33), ("Gregor", "IT", 44), ("Jane", "Math", 3), ("Mark", "Geography", 44), ("Gregor", "sdf", 32)) 
list: List[(String, String, Int)] = List((Gregor,Math,6), (Mark,Mat,33), (Gregor,IT,44), (Jane,Math,3), (Mark,Geography,44), (Gregor,sdf,32)) 

scala> val res = list.groupBy(_._1) map { case (k, xs) => k -> xs.size } toList 
res: List[(String, Int)] = List((Gregor,3), (Jane,1), (Mark,2)) 
3

Вы можете сделать это только с помощью foldLeft:

val t = List(("Gregor", "Math", 6), ("Mark", "Mat", 33), 
    ("Gregor", "IT", 44), ("Jane", "Math", 3), ("Mark", "Geography", 44), 
    ("Gregor", "sdf", 32)) 

val res = t.foldLeft(Map[String, Int]()) { case(m, (n, _, _)) => 
    m + (n -> (m.getOrElse(n, 0) + 1)) 
}.toList 
+0

Думаю, вам нужно использовать toList? По крайней мере, в противном случае у вас будет поистине ужасная сложность. –

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