Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中修改映射内部的数组_Kotlin - Fatal编程技术网

如何在Kotlin中修改映射内部的数组

如何在Kotlin中修改映射内部的数组,kotlin,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), "Social

我正在使用一个以字符串为键、以数组为值的映射。我想将映射调整为原始字符串,并将数组更改为平均值

原始地图是:

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}

但是,这将返回一个单位,而不是Kotlin中的贴图。我做错了什么?我正在完成一项lambda作业,他们希望我们使用foreach和reduce来获得答案。

您可以使用
foreach
reduce
,但这太过分了,因为您只需使用
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
函数:

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
是您的标准“将项目转换为其他项目”功能-如果您想输入一个集合并输出另一个集合(如将整数数组转换为单个整数平均值),则需要
map
。(名称来源于将值映射到其他值,并将其转换,这就是为什么您总是在输入时输出相同数量的项)

因为
forEach
不返回任何内容(返回单位),它只是在iterable对象(在您的情况下是数组)上迭代。在循环中,您可能希望将计算结果添加到
平均值中
谢谢,这对您帮助最大。你能举一个使用forEach的例子吗?当我使用它时,它将输出更改为Unit而不是Map。至于指令,我必须使用reduce来获得平均值,因此我能够将代码调整为:val averageRatings=appRatings.mapValues{(u,v)->v.reduce{acc,I->acc+I}/v.size}。但是现在的平均值是Int。将来我会使用你的方法。你能链接到练习吗?对于学习
forEach
,这似乎是一个很糟糕的例子,因为在这种情况下使用
mapValues
更为清晰。你可以通过制作一个可变的地图并复制平均值来实现,但这绝对是一个较差的解决方案
val averageMap=mutableMapOf();appRatings.forEach{(k,v)->averageMap[k]=v.average()}
。提示如下:“首先,创建一个名为averageRatings的映射,其中将包含应用程序名称到平均评分的映射。使用forEach遍历appRatings映射,然后使用reduce计算平均评分并将该评分存储在averageRatings映射中。”我同意,提出的解决方案要巧妙得多。即使有这样的提示,我也不认为我能自己解决这个问题。我已经花了大约1.5个小时试图解决这个问题,然后才在这里发布。