2015-10-22 48 views
1

刚刚开始使用Scala。每次尝试执行它时,都会显示不匹配的错误。我只返回整数。编译器仍然从上帝知道的地方找到类型Unitscala:类型不匹配(找到单元,你需要int)

object a { 
    def search(e : Int,arr : Array[Int]): Int = { 
    var l: Int = 0 
    for(l <- 0 arr.length) { 
     if(arr(l) == e) { 
     return e 
     } else { 
     return -1 
     } 
    } 
    } 

    def main(args: Array[String]) { 
    var i = 0 
    println("enter the number of elements ") 
    var n = readLine.toInt 

    println("enter the elements are") 
    var arr = new Array[Int](n) 
    for(i <- 0 to n-1) { 
     println("enter element "+i+" ") 
     arr(i) = readLine.toInt 
    } 
    for(i <- 0 to n-1) { 
     println("element "+i+" is "+arr(i)) 
    } 

    println("sorted array is") 
    arr = arr.sortWith(_ < _) 
    for(i <- 0 to n-1) { 
     println(arr(i)) 
    } 

    println("enter the number to be searched ") 
    var e = readLine.toInt 
    var result: Int = search(e,arr) 
    if(result == e) { 
     println("element found") 
    } else { 
     println("element not found") 
    } 
    } 
} 

输出

[email protected]:~$ scalac a.scala 
a.scala:6: error: type mismatch; 
found : Unit 
required: Int 
     for(l<-0 until arr.length) 
       ^
one error found 
+1

在Scala中编写这个代码的方法可能是http://pastebin.com/UrTSsDt1 –

回答

0

最初定义的search的更多scalish方法,受益于功能不可变性和Scala惯用元素。注阵列包含传达预期的语义,

def search(e : Int, arr : Array[Int]): Int = if (arr contains e) e else -1 

使用的理解,我们收益率找到的元素,并测试在结果列表中不空虚,

def search(e : Int, arr : Array[Int]): Int = { 
    val res = for (a <- arr if a == e) yield a 
    if (res.nonEmpty) res.head else -1 
} 

与此相关的是,我们遍历的每个元素而不必使用索引。还要考虑exists,将停止对遇到的第一场比赛,

def search(e : Int, arr : Array[Int]): Int = if (arr.exists(_ == e)) e else -1 

使用find我们提供的发现价值,否则-1

def search(e : Int, arr : Array[Int]): Int = arr.find(_ == e).getOrElse(-1) 

注意find返回一个Option,无论是Some(value)None如果没有一个是发现;用getOrElse我们处理未找到的案例。

2

错误的根本原因是在for,你忘了yield

在更大范围内,您可以运行从Java到Scala的经典转换问题。 您无法打破for循环。 (在现实中,你可以但只能用一种拙劣的方式:How to yield a single element from for loop in scala?)。

这里的一个可能的方法是利用巨大的Scala集合库whcih媒体链接包含你实现的功能:indexOf

def search(e : Int,arr : Array[Int]) : Int = arr.indexOf(e) 

会给预期的结果。

相关问题