gpt4 book ai didi

Scala - 计算 List[SomeObj] 中 SomeObj.double 的平均值

转载 作者:行者123 更新时间:2023-12-03 22:49:04 25 4
gpt4 key购买 nike

我正在使用 Scala 的第二个晚上,我抵制在 Scala 中写东西的冲动,就像我过去在 Java 中做的那样,并试图学习所有的习语。在这种情况下,我只想使用诸如闭包、映射和列表理解之类的东西来计算平均值。不管这是否是计算平均值的最佳方法,我只想知道如何在 Scala 中做这些事情,仅用于学习目的

这是一个例子:下面的平均方法几乎没有实现。我有其他几种方法来查找单个用户 ID 使用 TraversableLike 的 find 方法(我认为)给出的评级,但实际上没有更多特定于 Scala 的方法。我将如何计算给定 List[RatingEvent] 的平均值,其中 RatingEvent.rating 是一个 double 值,我会以类似 Scala 的方式计算该 List 的所有值的平均值?

package com.brinksys.liftnex.model

class Movie(val id : Int, val ratingEvents : List[RatingEvent]) {

def getRatingByUser(userId : Int) : Int = {
return getRatingEventByUserId(userId).rating
}

def getRatingEventByUserId(userId : Int) : RatingEvent = {
var result = ratingEvents find {e => e.userId == userId }
return result.get
}

def average() : Double = {
/*
fill in the blanks where an average of all ratingEvent.rating values is expected
*/
return 3.8
}
}

一个经验丰富的 scala 专家将如何填写该方法并使用 scala 的特性使其尽可能简洁?我知道我将如何在 Java 中做到这一点,这是我想要避免的。

如果我用 python 来做,我认为最 pythonic 的方式是:
sum([re.rating. for re in ratingEvents]) / len(ratingEvents)

或者如果我强制自己使用闭包(这是我至少想在 Scala 中学习的东西):
reduce(lambda x, y : x + y, [re.rating for re in ratingEvents]) / len(ratingEvents)

我想在scala中学习这些类型的东西的用法。

你的建议?欢迎任何指向与此相关的良好教程/引用资料的指针:D

最佳答案

如果您要对事物进行数学运算,请使用 List并不总是最快的方式,因为 List不知道多久了——所以ratingEvents.length花费的时间与长度成正比。 (不是很多时间,当然,但它确实必须遍历整个列表才能告诉。)但是如果您主要操作数据结构并且只是偶尔需要计算总和或其他什么,那么它不是时间关键的核心您的代码,然后使用 List是花花公子。

无论如何,规范的方法是使用折叠来计算总和:

(0.0 /: ratingEvents){_ + _.rating} / ratingEvents.length

// Equivalently, though more verbosely:
// ratingEvents.foldLeft(0.0)(_ + _.rating) / ratingEvents.length

或通过映射然后求和(仅限 2.8):
ratingEvents.map(_.rating).sum / ratingEvents.length

有关 map 和折叠的更多信息,请参阅 this question on that topic .

关于Scala - 计算 List[SomeObj] 中 SomeObj.double 的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com