2016-11-28 26 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。