【问题标题】:How to find duplicate values in Map如何在地图中查找重复值
【发布时间】:2019-07-16 05:50:34
【问题描述】:

我有以下Map[String, Int]

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

如何在Map 中查找重复值并打印带有List[String] 的值,如下所示:

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

【问题讨论】:

标签: scala dictionary


【解决方案1】:

试试

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

哪个输出

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

这是 Luis 的单行字:

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

【讨论】:

  • 我会省略toSeq,只在群组中调用keyskeySet。另外,由于只有重复很重要,我会使用collect 而不是map 来过滤。
  • @LuisMiguelMejíaSuárez 在groupBy 之后我似乎无法弄清楚如何使用keys,但我确实知道collect
  • 因为我在手机上,所以可能有错别字:groupBy(_._2).collect { case (key, group) if (group.size > 1) => key -> group.keySet } - Map 上的 groupBy 返回另一个 Map (至少在 2.13 中).
  • 不用担心,实际上我不会添加答案。因为我更喜欢 OP 试图用我给它的线索来解决它。 - 顺便说一句,对于任何有兴趣的人,在2.13+ 上,可以使用sizeIs > 1,这将比size > 1 更有效,因为第一个在返回之前不会计算所有大小(我只是知道,哈哈) i>.
【解决方案2】:

以下作品仅适用于 scala 2.13+

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]))

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2012-05-04
    • 2011-02-21
    • 2013-12-26
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多