【问题标题】:How to convert Map values to a set in scala如何将地图值转换为scala中的集合
【发布时间】:2015-06-17 21:52:44
【问题描述】:

在 Scala 的 Map class 中,keySet 方法返回 Map 键的集合。 未设置映射值的集合(因为两个键可能引用相同的值,因此它是一个多集)。 Map 类的valuesIterator 方法返回一个迭代器,使这些值可遍历,因此可以如下构建 Map 的值集:

val f=Map(1->10,2->15,3->20,4->20,6->20)
val it=f.valuesIterator
var valueSet=Set.empty[Int]
while (it.hasNext){
  valueSet=valueSet+it.next();
}

println(valueSet)  // this will print Set(10, 20, 15)

问题:

是否有任何简洁的方法可以将地图的值作为一个集合来获取?

【问题讨论】:

  • 我应该考虑更仔细地研究values 的可用方法,我的错!

标签: scala


【解决方案1】:

您可能正在TraversableOnce 上寻找toSet 方法:

def toSet[B >: A]: immutable.Set[B]

将此可遍历或迭代器转换为集合。 注意:对于无限大小的集合不会终止。

返回一个包含此可遍历或迭代器的所有元素的集合。

您可以通过 map.values.toSetmap.valuesIterator.toSet 将其与 Map 上的 valuesvaluesIterator 方法一起使用。

您可能还对采用可变参数的Set.apply 方法感兴趣,可以在这里调用:Set(map.values.toList:_*)

如果您确实需要像以前那样迭代地构建集合,您应该熟悉构建器模式,它允许您仅临时使用可变数据结构,并避免有状态且容易出错vars。例如在这里你可以做(Set.newBuilder ++= map.values).result

【讨论】:

    【解决方案2】:

    另一种解决方案是使用 swap 反转地图,然后抓取 keyset

    val myMap = Map(("A", 1), ("B", 2), ("C", 3))
    myMap.map(_.swap).keySet
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2012-12-08
      相关资源
      最近更新 更多