我理解如何在简单的整数列表上使用reduceLeft,但尝试在case类对象上使用if失败。
假设我有:
case class LogMsg(time:Int, cat:String, msg:String)
val cList = List(LogMsg(1,"a", "bla"), LogMsg(2,"a", "bla"), LogMsg(4,"b", "bla"))
我希望找到LogMsgs之间最大的时间差异。 我想做点什么:
cList.reduceLeft((a,b) => (b.time - a.time)
当然不起作用。
reduceLeft的第一次迭代比较前两个元素,它们都是LogMsg类型。之后,它将下一个元素(LogMsg)与第一次迭代(Int)的结果进行比较。
我的语法是否错误,或者我应该采用另一种方式?
答案 0 :(得分:6)
我可能会这样做:
(cList, cList.tail).zipped.map((a, b) => b.time - a.time).max
您需要事先检查cList
是否至少包含2个元素。
reduceLeft
不能用于返回最大的差异,因为它总是返回你正在减少的List的类型,在这种情况下是LogMsg
,而你要求的是Int
。
答案 1 :(得分:6)
我的尝试:
cList.sliding(2).map(t => t(1).time - t(0).time).max
我想到的另一个:由于LogMsg
是一个案例类,我们可以利用模式匹配:
cList.sliding(2).collect{
case List(LogMsg(a, _, _), LogMsg(b, _, _)) => b - a}.
max
答案 2 :(得分:0)
我建议您使用foldLeft
这是一个reduceLeft
,可以初始化结果。
val head::tail = cList
tail.foldLeft((head.time, 0)) ((a,b) => (b.time, math.max(a._2,b.time-a._1)))._2