2014-06-20 42 views
0

我有一個應用程序必須先收集一些外部數據,然後將它們變成對象。之後,它會對數據進行一些分析。當我迭代地圖時,會獲得什麼數據類型?

我設法收集數據並將其放入地圖。該映射包含每個未來對象的唯一鍵,以及構建該對象所需的數據的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 :( 

回答

4

Mapmap法的規定其他集合的方法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 

A { case ... }定義了部分函數;這樣你可以提取元組的值。

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 
相關問題