2012-10-12 35 views
2

我不明白這與斯卡拉hasmaps: 如何創建一個值或更新一個,如果它不存在?斯卡拉更新/在哈希表中創建值

我嘗試計算字符串列表中的字符數。

我試過這個代碼,但它不工作:

def times(chars: List[Char]): List[(Char, Int)] = { 
    val map = new HashMap[Char, Int]() 
    chars.foreach(
     (c : Char) => { 
      map.update(c, map.get(c) + 1) 
     }) 
} 

我理解的返回類型是不正確的。 但是我的foreach循環錯了嗎? 有沒有更漂亮的方法來寫它?

+1

我會建議匿名代碼片段,以便它們不會直接從Coursera課程作業中獲取特別是鑑於最近的「學術欺詐」警報。 – ach

回答

3

我認爲這會回答你的問題:

scala> "abaccdba".groupBy(identity).mapValues(_.length) 
res3: scala.collection.immutable.Map[Char,Int] = Map(b -> 2, d -> 1, a -> 3, c -> 2) 

哦,順便說一句HashMap有一個方法getOrElseUpdate以你原來的問題

+0

非常感謝。 我認爲使用先前的值(如果存在)更新或創建地圖值可能很有趣。 這怎麼可能? – bruce

+0

請參閱[API](http://www.scala-lang.org/api/current/scala/collection/mutable/Map.html) –

+0

只有在沒有任何值的情況下,API API才能訪問GetOrElseUpdate更新。而我想永遠更新。 有一種更新方法,但它不使用以前的值。 – bruce

0

如果有人想知道如何使用GetOrElseUpdate這裏是找到這個帖子我發現的例子:

val map = Map('a' -> 1, 'b' -> 2)   //> map : 
scala.collection.immutable.Map[Char,Int] = Map(a -> 1, b -> 2) 
val newval = map.getOrElse('b', 0) + 1  //> newval : Int = 3 
val updated = map + ('b' -> (newval))  //> updated : 
scala.collection.immutable.Map[Char,Int] = Map(a -> 1, b -> 3) 
+0

您也可以說「Map(...)withDefaultValue 0」,而不是使用getOrElse。 – ach