Суммирование котлина с группировкой по совокупности - PullRequest
0 голосов
/ 04 мая 2018

tl / dr: Как бы Котлин использовал groupingBy и агрегат, чтобы получить последовательность пар (ключ, число) для суммирования с картой отсчетов?

У меня есть 30 ГБ CSV-файлов, которые легко читать и анализировать.

File("data").walk().filter { it.isFile }.flatMap { file ->
    println(file.toString())
    file.inputStream().bufferedReader().lineSequence()
}. // now I have lines

Каждая строка - это «key, extraStuff, matchCount»

.map { line ->
    val (key, stuff, matchCount) = line.split(",")
    Triple(key, stuff, matchCount.toInt())
}.

и я могу отфильтровать «материал», который хорош, потому что лоты сбрасываются - ага, ленивые последовательности. (код опущен)

Но тогда мне нужен ленивый способ получить окончательную Карту (ключ: String to count: Int).

I думаю Я должен был бы использовать groupingBy и aggregate, потому что eachCount() будет просто считать строки, а не суммировать matchCount, а groupingBy будет ленивым, тогда как groupBy нет, но мы достигли конца мои знания.

.groupingBy { (key, _, _) ->
    key
}.aggregate { (key, _, matchCount) ->
    ??? something with matchCount ???
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете использовать расширение Grouping.fold вместо Grouping.aggregate. Это было бы более подходящим для суммирования сгруппированных записей по определенному свойству:

triples
    .groupingBy { (key, _, _) -> key }
    .fold(0) { acc, (_, _, matchCount) -> acc + matchCount }
0 голосов
/ 05 мая 2018

Вам нужно передать функцию с четырьмя параметрами в aggregate:

@ param operation: функция вызывается для каждого элемента со следующими параметрами:

  • key: ключ группы, к которой принадлежит этот элемент;
  • accumulator: текущее значение аккумулятора группы, может быть null, если это первый element, встреченный в группе;
  • element: элемент из агрегируемого источника;
  • first: указывает, является ли это первый element, встреченный в группе.

Из них вам нужно accumulator и element (которые вы можете разрушить). Код будет:

.groupingBy { (key, _, _) -> key }
.aggregate { _, acc: Int?, (_, _, matchCount), _ ->
    (acc ?: 0) + matchCount 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...