【问题标题】:how to calculate the average value with map filter and reduce functions in kotlin如何在kotlin中使用map filter和reduce函数计算平均值
【发布时间】:2021-09-06 09:27:30
【问题描述】:

我想使用 kotlin 中的 map、filter 和 reduce 函数计算一个值的平均值到一个集合中。

我是这样保存数据的:

data class  Track(
val id:String,
var name: String,
var popularity: Int,
var duration: Int,
var explicit: Int,
var artist: String,
var idArtist: String,
var releaseDate: String,
var danceability: Float,
var energy: Float,
var key: Float,
var loudness: Float,
var mode: Float,
var speechness: Float,
var acousticness: Float,
var instrumentalness: Float,
var liveness: Float,
var valence: Float,
var tempo: Float,
var timeSignature: Float

)

我以这种方式按年份对数据进行分组:

fun group_tracks_by_year(tracks: MutableList<Track>): Map<String, List<Track>> {

    val grouped_tracks = tracks.groupBy { it.releaseDate.split('-')[0] }.toSortedMap()
    return  grouped_tracks
}

例如,我想计算每年的平均节奏,我试图用map function 操作地图集合Map&lt;String, List&lt;Track&gt;&gt;,但我无法操作键值记录。

【问题讨论】:

  • 尝试将问题分解为更简单的步骤。如果您已经将数字放在一个简单的数组中,您将如何计算它们的平均值?
  • 谢谢。我想在不分解问题的情况下做到这一点。我知道用 rust、python 等其他语言解决同样的问题是可能的……所以我必须用 kotlin 做同样的事情。因此,解决方案可能会或非常简单,或者不可能
  • “我想在不分解问题的情况下这样做。”你为什么要那样做???从字面上看,所有的编程都是将复杂的问题分解成小问题并解决这些问题......

标签: dictionary kotlin filter reduce


【解决方案1】:

您不需要filterreduce。你可以使用sumOf

你应该使用mapValues,因为map返回一个List而不是一个具有相同键的Map。

val tempoAveragesByYear = tracksByYear.mapValues { (year, tracks) -> 
    (tracks.sumOf { it.tempo.toDouble() } / tracks.size ).toFloat()
}

【讨论】:

  • 谢谢,它可以工作,而且比我想象的更容易
猜你喜欢
  • 2015-03-25
  • 2016-02-23
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2017-09-26
  • 2020-07-03
  • 2016-08-01
相关资源
最近更新 更多