2013-02-08 60 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