我有一个应用程序必须首先收集一些外部数据,然后将它们转换为对象。之后,它会对数据进行一些分析。
我设法收集数据并将其放入地图中。映射包含每个未来对象的唯一键,以及构建对象所需数据的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 :(
答案 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