2015-09-15 108 views
0

我是Scala的新手,正在從事一個項目。我正在寫一個函數,它假定返回數組中最小的Int。但是,當我運行它時,我得到一個類型錯誤,它返回單位而不是int。爲什麼我的函數返回一個Unit而不是Int?

這裏是我的代碼:

def minWhile(r: Array[Int]): Int = { 
    var pos = 1 
    var minInt = r(0) 

    while (pos < r.length) { 
    if (r(pos) < minInt) 
     minInt = r(pos) 

    pos += 1 
    } 

    minInt 
} 

非常感謝您!

+0

您的代碼工作我的兩個斯卡拉控制檯和IntelliJ IDE – dazedconfused

+0

上你的代碼看起來很好,雖然它期望一個非空列表,並且可能有點必要。你能添加你得到的實際錯誤嗎? – thoredge

+0

我懷疑在你的實際代碼中,你忘記了'int'和'{'之間的=。儘管如此,請發佈提供錯誤的實際代碼。 –

回答

3

您的代碼編譯正確,因爲它始終返回正確的類型Int。但如果我們將空數組傳遞給函數,它可能會導致一些運行時異常:minWhile(Array())。

def minWhile(r: Array[Int]): Int = 
    { 
    var pos = 1 
    var minInt = r(0) /* potential runtime exception */ 
     while(pos < r.length){ 
     if(r(pos) < minInt) 
      minInt = r(pos) 
     pos+=1 

     } 
    minInt 
    } 

你必須檢查使用它的數組邊界。 或者你可以使用更短的方式:

def minWhile(r: Array[Int]): Option[Int] = if (r.nonEmpty) Some(r.min) else None 
+0

我忘了檢查空陣列。這可能是我的問題的原因。謝謝! – Misohappi

0

考慮輸送的minWhile語義的這種更實用的風格,如下,

def minWhile(r: Array[Int]): Int = { 
    (r zip r.drop(1)).takeWhile(t => t._1 > t._2).last._2 
} 

,我們連續拉鍊項目和take那些單調遞減。期望的結果在最後一個雙元的第二部分中找到。

相關問題