gpt4 book ai didi

scala - 如何深入比较每个元素与 Scala 列表中的其他元素(可选字段)

转载 作者:行者123 更新时间:2023-12-02 07:16:57 25 4
gpt4 key购买 nike

我有代表报告的案例类,报告有费用。

case class FakeExpense(amount: Option[Double], country: Option[String], currency: Option[String])
case class FakeReport(id: Int, expenses: List[FakeExpense])

如果报告有效或无效,我想返回 true/false,如果有 2 笔费用具有完全相同的字段,则无效...用 scala 做这样的事情的正确方法是什么?

有效报告:

val report = FakeReport(1, List(FakeExpense(Some(150), Some("US"), Some("USD")),FakeExpense(Some(85), Some("DE"), Some("EUR"))))

无效报告:

val report = FakeReport(2, List(FakeExpense(Some(150), Some("US"), Some("USD")),FakeExpense(Some(150), Some("US"), Some("USD"))))

谢谢!

最佳答案

考虑 List.distinct像这样的方法

def isValidReport(report: FakeReport): Boolean =
report.expenses.distinct.length == report.expenses.length

上述解决方案对列表进行了三次遍历。应用 Luis 的评论,我们可以像这样减少两次通过

def isValidReport(report: FakeReport): Boolean = {
report.expenses.sizeIs == report.expenses.iterator.distinct.length
}

我们削减了一次通过,因为 distinct.length 折叠为 iterator.distinct.length 中的单个转换。 sizeIs是一种潜在的快速节省,我们可能不必遍历整个列表。

这是一个基于 HashSet 的单遍尾递归解决方案,具有 O(eC)查找和插入

def isValidReport(report: FakeReport): Boolean = {
val set = mutable.HashSet[FakeExpense]()
@tailrec def loop(l: List[FakeExpense]): Boolean = l match {
case Nil => true
case h :: t => if (set.add(h)) loop(t) else false
}
loop(report.expenses)
}

另请注意我们如何在第一次复制时提前返回。

关于scala - 如何深入比较每个元素与 Scala 列表中的其他元素(可选字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60373872/

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