【问题标题】:How to find Minimum in a sequence如何在序列中找到最小值
【发布时间】:2016-06-10 11:05:39
【问题描述】:
A = ... //tuples of Medication(patientid,date,medicine)
B = A.groupby(x => x.patientid)

示例 B 如下所示 - 现在我需要找到最短日期,如何在 scala 中做到这一点??

(
  478009505-01,
  CompactBuffer(
    Some(Medication(478009505-01,Fri Jun 12 10:30:00 EDT 2009,glimepiride)), 
    Some(Medication(478009505-01,Fri Jun 12 10:30:00 EDT 2009,glimepiride)),
    Some(Medication(478009505-01,Fri Jun 12 10:30:00 EDT 2009,glimepiride))
  )
)

【问题讨论】:

  • 没有足够的代码来理解你想要什么。发布A 的代码以及B 的确切代码。

标签: scala sorting apache-spark minimum


【解决方案1】:

对类型做一些假设:

case class Medication(id: Int, date: String, medicine: String)

val l = List(
  Some(Medication(478009505, "Fri Jun 12 10:30:00 EDT 2010", "glimepiride")),
  Some(Medication(478009505, "Fri Jun 12 10:30:00 EDT 2008", "glimepiride")),
  None,
  Some(Medication(478009505, "Fri Jun 12 10:30:00 EDT 2011", "glimepiride"))
)

您可以使用 for 推导式提取所有日期,然后使用 minBy 获取最小值:

import java.text.SimpleDateFormat
val format = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy")
def createDateTime(s: String) = new Date(format.parse(s).getTime))

val dates = for { 
    optMed <- l                  // foreach item
    med <- optMed                // if it contains some value
} yield createDateTime(med.date) // create a comparable date

dates.minBy(_.getTime)           // get the minimum date

结果是最早的日期(2008-06-12)

【讨论】:

  • 看起来不错。我建议使用 .flatMap 而不是 filter(_.isDefined)map。此外,排序和获取第一个元素的效率不如minBy,后者运行时间为 O(n) 而不是 O(n*logn)。试试看:l.flatMap(x =&gt; new Date(...)).minBy(_.getTime)
  • 感谢 minBy,不知道这些。如果我使用 flatMap,我会得到 NoSuchElements 吗?
  • 哎呀,你是对的;我的错。它必须是l.flatMap(_.map(x =&gt; new Date(...)))flatMap 就像 map 然后 flatten 在这种情况下
  • 我更喜欢这样,因为编译器知道 x 不是一个选项,但它的可读性稍差。我猜是 scala,所以编译器安全获胜。
  • 是的,我绝对同意flatMap(_.map 的可读性较差。正如您所说,最好避免使用.get,因为如果有人删除了_.isDefined 位,我们将得到运行时错误而不是编译时错误。也许我们可以通过命名变量使其更具可读性:l.flatMap(dateOption =&gt; dateOption.map(x =&gt; new Date(format.parse(x.date).getTime)))? (我在这里只是为了谈话而分道扬镳)
猜你喜欢
  • 1970-01-01
  • 2017-01-10
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2015-04-28
  • 2017-05-30
相关资源
最近更新 更多