2014-01-05 154 views
1
val dna1 = "ATATCCG" 
val dna2 = "TCCGA" 
val dna3 = "ATGTACTG" 
val arr = Array.ofDim[(Int, (Int, Int, Int))](dna1.length + 1, dna2.length + 1, dna3.length + 1) 

for (i1 <- 0 to dna1.length) 
    for (i2 <- 0 to dna2.length) 
    for (i3 <- 0 to dna3.length) 
     arr(i1)(i2)(i3) = { 
     def mkPair(i1: Int, i2: Int, i3: Int, diff: Int = 0) = { 
      (arr(i1)(i2)(i3)._1 + diff, (i1, i2, i3)) 
     } 
     if (i1 + i2 + i3 == 0) (0, null) 
     else if (i1 * i2 * i3 == 0) (0, (0 max (i1 - 1), 0 max (i2 - 1), 0 max (i3 - 1))) 
     else List(
      mkPair(i1 - 1, i2 - 1, i3 - 1, if (dna1(i1 - 1) == dna2(i2 - 1) && dna1(i1 - 1) == dna3(i3 - 1)) 1 else 0), 
      mkPair(i1, i2 - 1, i3 - 1), 
      mkPair(i1 - 1, i2, i3 - 1), 
      mkPair(i1 - 1, i2 - 1, i3), 
      mkPair(i1 - 1, i2, i3), 
      mkPair(i1, i2 - 1, i3), 
      mkPair(i1, i2, i3 - 1) 
     ).maxBy(_._1) 
     } 

我收到的一些錯誤,我不還是得到有關分號,它不應該去?...斯卡拉maxBy問題

error: value maxBy is not a member of List[(Int, (Int, Int, Int))] 
possible cause: maybe a semicolon is missing before `value maxBy'? 
       ).maxBy(_._1) 
       ^

什麼會克服這一點的最好辦法問題與

+0

作爲一個便箋,你可以將你的代碼摺疊成一個'for(i1 < - 0到dna1.length; i2 < - dna2.length; i3 < - dna3.length)'。你也應該能夠簡單地使用'max',因爲對於元素排序爲'(2,1)>(1,2)'的元組存在隱式的詞典排序。 –

+0

你可以請完成代碼,這會像'for(i1 < - 0到dna1.length; i2 < - dna2.length; i3 < - dna3.length)def mkPair(i1:Int,i2:Int,i3 :Int,diff:Int = 0)= {(arr(i1)(i2)(i3)._ 1 + diff,(i1,i2,i3)) }'不得到最大部分... – cMinor

+0

使用多個生成器在單一的「for」理解中相當於將每個生成器嵌套在自己的理解中; (a < - as; b < - bs){...}'被重寫爲'as.foreach(a => bs.foreach(b => ...))',所以你可以消除兩個級別縮進。至於'max',請嘗試在repl中輸入'List((1,2),(2,1))。max',您將得到'(2,1)'。 –

回答

4

用scalac 2.10.0編譯我很好。在Scala 2.9.0中添加了maxBy。確保你使用scalac 2.9.0+編譯你的代碼。