我想访问一个列表中一个列表的元素,并检查这些元素是否大于最小值。示例:List [([1,2],0.3),([1.5,6],0.35),([4,10],0.25),([7,15],0.1)]
设最小值:1
结果应为:List [([[1,6],0.65),([4,10],0.25),([7,15],0.1)]
由于1.5-1小于最小值1,它将将元素[1,2],0.3)和([1.5,6],0.35)合并为[1,6],0.65,这意味着它将采用内部列表的第一个元素和第二个元素的最后一个元素外部列表和外部列表的第二个元素将被添加(0.3 + 0.35)。将对外部列表的所有元素执行此操作。我尝试的代码如下所示:
def reduce (d1:List[(Interval, Rational)]): List[(Interval, Rational)] =
{
var z = new ListBuffer[(Interval, Rational)]()
def recurse (list: List[(Interval, Rational)]): Unit = list match {
case List(x, y, _*) if ((y._1_1 - x._1_1) < min_val) =>
val i = x._1_1; y._1_2
val w = x._2 + y._2
z += (i,w)
else
z += x
recurse(list.tail)
case Nil =>
}
z.toList
}
但这是行不通的。请帮助我解决此问题。
好的,您编写的实际上不是Scala代码,为了获得可编译的示例,我不得不进行一些修改,但是请看这是否对您有用。
type Interval = (Double,Double)
type Rational = Double
def reduce (lir:List[(Interval, Rational)]): List[(Interval, Rational)] = {
val minVal = 1.0
lir.foldLeft(List.empty[(Interval, Rational)]){
case (a, b) if a.isEmpty => List(b)
case (acc, ((i2a, i2b), r2)) =>
val ((i1a, _), r1) = acc.head
if (i2a - i1a < minVal) ((i1a, i2b), r1 + r2) :: acc.tail
else ((i2a, i2b), r2) :: acc
}.reverse
}
测试用例:
reduce(List( ((1.0,2.0),0.3), ((1.5,6.0),0.35), ((4.0,10.0),0.25), ((7.0,15.0),0.1) ))
// result: List[(Interval, Rational)] = List(((1.0,6.0),0.6499999999999999), ((4.0,10.0),0.25), ((7.0,15.0),0.1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句