2016-02-27 18 views
-1
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)) 
) 
) 
+0

沒有足夠的代碼來理解你想要的。發佈什麼是「A」,什麼是「B」。 – marcospereira

回答

0

製作的類型的一些假設:

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")) 
) 

您可以使用爲理解,提取所有的日期,然後拿到分鐘,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)

+1

這看起來不錯。我建議使用.flatMap而不是'filter(_。isDefined)'和'map'。排序並取第一個元素的效率不如'minBy',它運行在O(n)時間而不是O(n * logn)。試試:'l.flatMap(x => new Date(...))。minBy(_。getTime)' –

+0

感謝minBy,不知道那些。如果我使用flatMap,我會爲Nones獲得NoSuchElements? – soote

+1

啊,你說得對;我的錯。它必須是'l.flatMap(_。map(x => new Date(...)))''。 'flatMap'就像'map',然後'flatten'在這種情況下 –