2013-02-08 61 views
0

我有一個地圖[字符串,字符串],我想按特定的順序打印它取決於鍵。例如,我想打印ID,名稱,地址的值。所以我想將我的鍵匹配到「id」,「name」,「address」,然後在每個鍵上打印值。我有以下的代碼,但它不工作:斯卡拉按順序打印地圖

articlesmap.keys match{ 
    case ("id") => println(articlesmap.get("id")) 
     case ("name") => println(articlesmap.get("name")) 
     case ("address") => println(articlesmap.get("address")) 
} 
+1

爲什麼模式匹配?爲什麼不只是'println'語句? –

+0

@nimda指出我覺得非常有用。無論替代解決方案如何,您都試圖在映射的「鍵」上進行匹配,這是一個'Iterator [String]'; * *表示你沒有得到預期結果的確切原因。 –

回答

7

你可以使用for

for { 
    k <- Seq("id", "name", "address") // the keys in the order you want to print them. 
    v <- articlesmap.get(k) 
} println (k+ " is " + v) 

如果你只想打印值,collect會做得很好:

Seq("id", "name", "address") collect articlesmap foreach println 

collectmap ID更好的你無法確定密鑰實際上是否在地圖中。

1

可變articlesmap.keys是Iterable[String]型的,但你的情況下,比賽是在String類型的匹配。試試這個:

def mapTest(map: Map[String, String]) { 
    map.keys.foreach { 
     case ("id") => println(map.get("id")) 
     case ("name") => println(map.get("name")) 
     case ("address") => println(map.get("address")) 
    } 
    }            

    val mapper = Map("id" -> "123", "name" -> "Bob", "address" -> "123 Fake Street") 

    mapTest(mapper) 

    // => Some(123) 
    // Some(Bob) 
    // Some(123 Fake Street) 
+0

訂單不是我想要的,訂單是地圖中的內容,因此目的被打敗,我想按照我想要的順序打印。 –

1

您可以創建一個OrderedMap或者您可以對keys進行排序並處理該類結果。

2

這裏是最簡單的解決辦法,因爲我知道:

scala> val keys = Seq("id", "name", "address") 
keys: Seq[java.lang.String] = List(id, name, address) 

scala> val articlesmap = Map("id" -> 1, "name" -> "john", "address" -> "some address") 
articlesmap: scala.collection.immutable.Map[java.lang.String,Any] = Map(id -> 1, name -> john, address -> some address) 

scala> keys map articlesmap foreach println 
1 
john 
some address 

scala> val keys = Seq("name", "id", "address") 
keys: Seq[java.lang.String] = List(name, id, address) 

scala> keys map articlesmap foreach println 
john 
1 
some address