簡體   English   中英

如何在 Kotlin 中修改地圖內的數組

[英]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 來獲得答案。

您可以使用forEachreduce ,但這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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM