迭代地图时我会得到什么数据类型?

时间:2014-06-20 12:45:10

标签: scala

我有一个应用程序必须首先收集一些外部数据,然后将它们转换为对象。之后,它会对数据进行一些分析。

我设法收集数据并将其放入地图中。映射包含每个未来对象的唯一键,以及构建对象所需数据的ListBuffer。

现在我想从这张地图创建一个对象列表,而不知道如何将我的数据从地图中删除。我以前没有使用过地图(是的,我是该语言的新手),但发现a question说,当我想用​​head访问地图元素时,我得到了关键和价值的元组。当我用map(方法)迭代地图时,我希望我得到相同的结果,但这似乎不起作用。我查看了使用Scala编程,但在迭代地图时无法找到一个说明我得到的地方。

这是我想要做的MWE:

//This code will gather number names from different languages and then create objects of type Number containing each name. 


import scala.collection.mutable
import scala.collection.mutable.ListBuffer


class Number (val theNumber: Int, val names: List[String]) {
  override def toString = theNumber + " is known as " + names.mkString(", ") + "."
}

// Construct a map holding example data 
val numbersAsMap = mutable.Map.empty[Int, ListBuffer[String]] 

numbersAsMap += (1 -> new ListBuffer[String])
 numbersAsMap += (2 -> new ListBuffer[String])
numbersAsMap += (3 -> new ListBuffer[String])

numbersAsMap(1) += "one"
numbersAsMap(1) += "eins"
numbersAsMap(1) += "uno"

numbersAsMap(2) += "two"
numbersAsMap(2) += "zwei"
numbersAsMap(2) += "due"

numbersAsMap(3) += "three"
numbersAsMap(3) += "drei"
numbersAsMap(3) += "tre"

// Create a list of numbers 
numbersAsMap map ((key, value) => new Number(key, value.toList)).toList
// error: missing parameter type

// obviously I'm not getting tuples, let's try it another way
numbersAsMap.keys map (key => new Number(key, numbersAsMap(key).toList)).toList
// it throws the same error as above :( 

2 个答案:

答案 0 :(得分:4)

map的{​​{1}}方法符合其他集合的Map方法,因此它的主体只获取一个参数。如果是map,则这是一个由键和值组成的元组。

所以你可以写:

Map

如果要命名元组值:

numbersAsMap.map(kv => new Number(kv._1, kv._2.toList)).toList

但还有另一种方法可以在一行中很好地编写它:使用部分函数:

numbersAsMap.map {
  kv =>
    val (key, value) = kv
    new Number(key, value.toList)
}.toList

numbersAsMap.map { case (key, value) => new Number(key, value.toList) }.toList 定义部分函数;这样你就可以提取元组的值。

答案 1 :(得分:2)

以下是在map上执行Map操作的两种可能方法:

val result = numbersAsMap.map{
  case (key, value) =>
    new Number(key, value.toList)
}.toList

val result2 = numbersAsMap.map(kv => new Number(kv._1, kv._2.toList)).toList