Dogil
Dogil

Reputation: 107

How to find duplicate values in Map

I have the following Map[String, Int]:

val m = Map[String, Int](
  "[LOGIN-011]" -> 0,
  "[LOGIN-103]" -> 3,
  "[LOGIN-222]" -> 10,
  "[ERROR-110]" -> 1,
  "[ERROR-012]" -> 3,
  ...
)

How to find duplicated values in the Map and print the values with List[String] as follows:

3 -> List("[LOGIN-103]", "[ERROR-012]")

Upvotes: 1

Views: 748

Answers (2)

Bogdan Vakulenko
Bogdan Vakulenko

Reputation: 3390

Following works in scala 2.13+ only

val map = Map (
  "[LOGIN-011]" -> 0,
  "[LOGIN-103]" -> 3,
  "[LOGIN-222]" -> 10,
  "[ERROR-110]" -> 1,
  "[ERROR-012]" -> 3
)

val duplicateValues = map.groupMap(_._2)(_._1).filterNot(_._2.sizeIs == 1)

//Map(3 -> List([ERROR-012], [LOGIN-103]))

Upvotes: 3

Mario Galic
Mario Galic

Reputation: 48410

Try

m
  .toSeq
  .groupBy { case (key, value) => value }
  .collect { case (key, values: List[(String, Int)]) if values.size > 1 => (key, values.map(_._1))  }

which outputs

HashMap(3 -> List([ERROR-012], [LOGIN-103]))

Here is Luis' one-liner:

m.groupBy(_._2).collect { case (key, group: Map[String, Int]) if group.size > 1 => (key, group.keySet) }

Upvotes: 3

Related Questions