如何通过键选择对并将它们转换为映射?

时间:2017-10-30 09:50:19

标签: scala collections

假设我有一个类型为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))
}

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

1 个答案:

答案 0 :(得分: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是否为 map.keys subset