Scala - агрегирующие кортежи - PullRequest
0 голосов
/ 10 мая 2018

У меня есть список кортежей:

val serverList = List(
    ("AS-4019", 100),
    ("BR-5722", 2080),
    ("SQ-9985", 70),
    ("BR-5722", 82),
    ("BR-5722", 147),
    ("AS-4019", 7),
    ("SQ-9985", 29),
    ("AS-4019", 64),
    ("SQ-9985", 93),
    ("GN-1070", 1408),
    ("BR-5722", 19),
    ("GN-1070", 7798))

Строка является идентификатором сервера, число связано с загрузкой сервера, и каждый кортеж представляет проект, обращающийся к серверу.

Мне нужно объединить этот список в:

List(serverNameString, accessCountInt, serverLoadInt)

Результат должен выглядеть примерно так:

List(
    ("AS-4019", 3, 171),
    ("BR-5722", 4, 2328),
    ("SQ-9985", 3, 192),
    ("GN-1070", 2, 9206))

Я пытался использовать некоторые карты и фильтры, но он кажется слишком сложным и также не работает.

val aggregatedList = for(v <- lisinputt.distinct) {
    (v, lisinputt.groupBy(identity).mapValues(_.size)(v))
}

1 Ответ

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

Для списка ввода

val serverList = List(
  ("AS-4019", 100),
  ("BR-5722", 2080),
  ("SQ-9985", 70),
  ("BR-5722", 82),
  ("BR-5722", 147),
  ("AS-4019", 7),
  ("SQ-9985", 29),
  ("AS-4019", 64),
  ("SQ-9985", 93),
  ("GN-1070", 1408),
  ("BR-5722", 19),
  ("GN-1070", 7798))

Это может быть достигнуто с помощью

serverList.groupBy(_._1).map {
  x => ( x._1, x._2.size , x._2.map(_._2).sum )
}

, который даст вам результат в виде

res0: scala.collection.immutable.Iterable[(String, Int, Int)] = List((AS-4019,3,171), (SQ-9985,3,192), (BR-5722,4,2328), (GN-1070,2,9206))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...