def countChars(str: String) = {
def loop(chars: List[Char], acc: Map[Char, Int]): Map[Char, Int] = {
chars match {
case Nil => acc
case char :: rest =>
loop(rest, acc + (char -> (acc(char) + 1)))
}
}
loop(str.toList, Map.empty[Char, Int] withDefaultValue 0)
}
測試:
@ val fruit: String = "dasisteintest"
fruit: String = "dasisteintest"
@ countChars(fruit)
res4: Map[Char, Int] = Map('e' -> 2, 's' -> 3, 'n' -> 1, 't' -> 3, 'a' -> 1, 'i' -> 2, 'd' -> 1)
無論你在這裏使用的是從scala api,Map.apply
或Map.empty
或List.::
。不會使用scala api中的任何函數。我的猜測是,你不應該使用像groupBy
這樣的東西,你應該做一些更低層次的事情。摺疊是自然的解決方案,如foldLeft
,但如果這被認爲是「使用scala api的函數」,那麼您可以自己實現foldLeft
,就像我在解決方案中那樣。
至於withDefaultValue
你可以用明確的檢查來替換它,如果存在值並且在那種情況下放置1。
你不知道如何改變列表或地圖是不可變的嗎?您只需更改該值即可創建新列表。
對於地圖,給
val map = Map('a' -> 3)
可以更新它做
@ map.updated('a', 4)
res6: Map[Char, Int] = Map('a' -> 4)
或
@ map + ('a' -> 4)
res7: Map[Char, Int] = Map('a' -> 4)
都這樣做完全同樣的事情 - 插入或更新 - 並返回新地圖。
在這裏你可以找到如何在列表更新元素
Replace element in List with scala
雖然你很少想通過索引來訪問列表,而只是建立從舊的一個新的列表,同時遍歷它以某種方式,例如與摺疊。
並不清楚你的實際問題是什麼返回字符的功能。假設你不只是在某人回答你的任務後,你卡在哪裏?輸出應該是什麼樣子? 'Map'(和'groupBy')是scala-api的一部分,所以目前還不清楚你想要什麼。你可以用什麼? –
正如我在上面寫的,我需要像** fruit.groupBy(identity).mapValues(_。size)**一樣的結果**,但沒有來自scala-api **的函數**。我所有的嘗試都失敗了,因爲每次我需要更改List的一個元素。我知道我「只」必須使用更改後的元素創建新的列表。但我不知道如何通過更改元素來實現它。所以我希望有人能夠幫助我更改List的元素(不包括api中的函數),或者有人用另一種方式來計算字符串中不同的字符......現在希望每件事都清楚嗎? – theoretisch