2016-09-21 21 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としてマージします。つまり、内部リストの最初の要素をとり、外部リストの第2要素の要素と外部リストの第2要素が追加されます(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

あなたが書いたことは実際には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

それは働いた!ありがとうございました。 –

関連する問題