[英]How to I modify arrays inside of a map in Kotlin
我正在使用字符串作為鍵和數組作為值的映射。 我想將地圖調整為原始字符串並將數組更改為平均值。
原圖為:
val appRatings = mapOf(
"Calendar Pro" to arrayOf(1, 5, 5, 4, 2, 1, 5, 4),
"The Messenger" to arrayOf(5, 4, 2, 5, 4, 1, 1, 2),
"Socialise" to arrayOf(2, 1, 2, 2, 1, 2, 4, 2)
)
我試圖做的是:
val averageRatings = appRatings.forEach{ (k,v) -> v.reduce { acc, i -> acc + 1 }/v.size}
然而,這將返回一個 Unit 而不是 Kotlin 中的地圖。 我究竟做錯了什么? 我正在完成一個 lambda 任務,他們希望我們使用 foreach 和 reduce 來獲得答案。
您可以使用forEach
和reduce
,但這mapValues
矯枉過正,因為您可以只使用mapValues
並取平均值:
val appRatings = mapOf(
"Calendar Pro" to arrayOf(1, 5, 5, 4, 2, 1, 5, 4),
"The Messenger" to arrayOf(5, 4, 2, 5, 4, 1, 1, 2),
"Socialise" to arrayOf(2, 1, 2, 2, 1, 2, 4, 2)
)
val averages = appRatings.mapValues { (_, v) -> v.average() }
println(averages)
輸出:
{Calendar Pro=3.375, The Messenger=3.0, Socialise=2.0}
您可以使用mapValues
函數執行此mapValues
:
val appRatings = mapOf(
"Calendar Pro" to arrayOf(1, 5, 5, 4, 2, 1, 5, 4),
"The Messenger" to arrayOf(5, 4, 2, 5, 4, 1, 1, 2),
"Socialise" to arrayOf(2, 1, 2, 2, 1, 2, 4, 2)
)
val ratingsAverage = appRatings.mapValues { it.value.average() }
你已經得到了一些答案(包括字面意思來自 JetBrains??很好)但只是為了清除forEach
:
forEach
是一個“對每個項目做某事”的函數,它什么都不返回(嗯, Unit
)——它是終端,你可以在鏈中做的最后一件事,因為它不返回一個值來做任何其他事情。 它基本上是一個for
循環,它是關於副作用的,而不是轉換傳入的集合並產生不同的數據。
onEach
是類似的,除了它返回原始項目 - 所以你在一個集合上調用onEach
,你會得到相同的集合作為結果。 所以這個不是終端,你可以把它彈出到一個函數鏈中,用當前的一組值做一些事情,而不用改變它們。
map
是您的標准“將項目轉換為其他項目”功能 - 如果您想放入一個集合並取出不同的集合(例如將 Int 數組轉換為單個 Int 平均值),那么您需要map
。 (該名稱來自將值映射到其他值,並對其進行轉換 - 這就是為什么您總是得到與放入的項目相同數量的項目)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.