如何在scala中访问列表中的列表元素

时间:2016-09-21 07:27:02

标签: list scala

我想在一个列表中访问列表的元素,并检查元素是否大于最小值。 示例:列表[([1,2],0.3),([1.5,6],0.35),([4,10],0.25),([7,15],0.1)]
设最小值:1
结果应为:列表[([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
}  

但这不起作用。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

好的,你所写的内容实际上不是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))