【问题标题】:How to select pairs by keys and transform them to map?如何通过键选择对并将它们转换为映射?
【发布时间】:2017-10-30 09:50:18
【问题描述】:

假设我有一个List[(Int, String)] 类型的键值对列表和一组Set[Int] 类型的键。我正在编写一个函数来返回一个映射Map[Int, String],它包含给定集合中的所有键,并且只包含那些键。如果对不包含所有键或包含重复键,则返回错误。

为简单起见,我在这里返回OptionSome 表示成功,None 表示失败。

def foo(pairs: List[(Int, String)], keys: Set[Int]): Option[Map[Int, String]] = {
  val m = pairs.groupBy(_._1).filterKeys(keys)
  if (m.keys != keys || m.exists(_._2.size != 1)) None else Some(m.mapValues(_.head._2))
}

上面的代码可能有效,但看起来很笨拙。你会如何改进它?

【问题讨论】:

    标签: scala collections


    【解决方案1】:
      def foo(pairs: List[(Int, String)], keys: Set[Int]): Option[Map[Int, String]] = {
        val m = pairs.toMap
        keys.subsetOf(m.keys.toSet) && m.size == pairs.size match {
          case true =>  Some(m.filterKeys(keys))
          case false => None
        }
      }
    

    使用subsetOf检查keys是否是ma​​p.keyssubset

    【讨论】:

    • 谢谢。你检查pairs 是否有重复的键?
    • 要不要&& m.size == pairs.size比较大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2016-02-18
    • 2021-07-11
    相关资源
    最近更新 更多