2016-11-28 27 views
0

下面是我的scala代碼,但是第13行,有一個錯誤說「缺少參數類型」,不知道我的問題是什麼?什麼是我的foreach在Scala代碼中的問題

class OneAway { 

    def isOneAway(s1:String, s2:String):Boolean={ 
    if(s1.equals(s2)) 
     return true 
    else if(s1.length > s2.length + 1 || s1.length < s2.length - 1) 
     return false 
    else 
    { 
     var count:Int=0 
    s1.chars().forEach(a=>{ 
     if(a!=s2.charAt(count)){   
      return s2.substring(count+1).equals(s1.substring(count)) || s1.substring(count+1).equals(s2.substring(count)) 
     } 
     count=count+1 
     } 
     )  
     return true 
    } 

    } 
} 

回答

5

foreach應該全部小寫,再加上花括號內的大括號。

此外,即使你沒有問...這是一個可怕的方式來編寫scala代碼。在99%的案例中,你會想避免使用返回,可變狀態和(有一些例外)索引訪問序列。 您的代碼在某些情況下也會拋出非法索引異常。

一種合適的方式,做你想做的事,斯卡拉將是這樣的:

@tailrec 
def isOneAway(s1: String, s2: String): Boolean = (s1.headOption, s2.headOption) match { 
    case (None, None) => true 
    case (a,b) if a == b => isOneAway(s1.tail, s2.tail) 
    case _ if s1.length == s2.length + 1 => s1.tail == s2 
    case _ if s2.length == s1.length + 1 => s2.tail == s1   
    case _ => false 
} 
+0

這是Scala世界更準確的答案。在大多數情況下,您必須避免if .. else結構。 – Pavel

+0

我可以知道最後三種情況是什麼意思嗎?謝謝。 – sweetyBaby

+0

什麼旅行你關於他們?如果第二個字符串比第一個字符短一個字符,並比較其餘字符。如果第一個字符串被縮短一個,則放棄它的第一個字符並比較其餘字符。否則,長度不會被關閉,所以只需返回false。 – Dima

4

應該

s1.foreach(a=>{....}) 

字符()是java8和你正在使用Scala的。你可以簡單地在String對象上使用foreach。