如何将Map值转换为scala中的集合

时间:2015-06-17 21:52:44

标签: scala

在Scala的MailKit中,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)

问题:

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

2 个答案:

答案 0 :(得分:4)

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

  

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

     

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

     

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

您可以Mapmap.values.toSetmap.valuesIterator.toSet上与valuesvaluesIterator方法一起使用。

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

如果你确实需要像你所做的那样迭代地构建一个集合,你应该熟悉构建器模式,它允许你暂时只使用一个可变数据结构,并避免有状态和容易出错{{1} }。例如,您可以执行vars

答案 1 :(得分:0)

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

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