Scala - Как сгруппировать элементы по происхождению? - PullRequest
0 голосов
/ 03 мая 2018

Есть ли в scala функция, которая группирует все элементы списка по количеству этих вхождений?

Например, у меня есть этот список:

val x = List("c", "b", "b", "c", "a", "d", "c")

И я хочу получить новый список, подобный этому:

x = List((3, "c"), (2, "b"), (1, "a"), (1, "d"))

Ответы [ 2 ]

0 голосов
/ 13 июля 2018

Попробуйте, чтобы получить именно то, что вы хотите в указанном вами порядке. (то есть, порядок сохраняется в списке при подсчете):

x.distinct.map(v=>(x.filter(_==v).size,v))

В SCALA REPL:

scala> val x = List("c", "b", "b", "c", "a", "d", "c")
x: List[String] = List(c, b, b, c, a, d, c)

scala> x.distinct.map(v=>(x.filter(_==v).size,v))
res225: List[(Int, String)] = List((3,c), (2,b), (1,a), (1,d))

scala>
0 голосов
/ 03 мая 2018

Вы можете сначала сосчитать вхождения каждого элемента, а затем обратить вспять полученные кортежи:

List("c", "b", "b", "c", "a", "d", "c")
  .groupBy(identity).mapValues(_.size) // Map(b -> 2, d -> 1, a -> 1, c -> 3)
  .toList                              // List((b,2), (d,1), (a,1), (c,3))
  .map{ case (k, v) => (v, k) }        // List((2,b), (1,d), (1,a), (3,c))

Вы специально не упоминаете понятие порядка для выходных данных, но если бы это было требованием, это решение нужно было бы адаптировать.

...