2016-09-21 35 views
0

我想一個列表內訪問列表的元素並檢查元素是否比最低值。 實施例:列表[([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 
} 

但是這不起作用。請幫我解決這個問題。

+0

這不是真的清楚你要什麼過濾;在你想要的結果中,'([1,6],0.65)是從哪裏來的?它不在原始列表中... – maioman

+0

請[閱讀有關MCV](http://stackoverflow.com/help/mcve)的代碼示例。 – jwvh

+0

我編輯了這個問題。 –

回答

2

OK,你寫的真的是不是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)) 
+0

它工作!謝謝。 –