刚开始使用Scala。每次我尝试执行它时,都会显示不匹配错误。我只返回整数。仍然编译器发现来自上帝的类型Unit
知道在哪里。
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")
}
}
}
输出
yudhveer@lfc:~$ scalac a.scala
a.scala:6: error: type mismatch;
found : Unit
required: Int
for(l<-0 until arr.length)
^
one error found
答案 0 :(得分:2)
错误的基本原因在于for
,您忘记了yield
。
在较大规模上,您运行从Java到Scala的经典转换问题。 你不能打破for循环。 (实际上,你只能以一种愚蠢的方式:How to yield a single element from for loop in scala?)。
这里可能的方法是使用伟大的Scala Collection Library,它已经包含了您实现的功能:indexOf
:
def search(e : Int,arr : Array[Int]) : Int = arr.indexOf(e)
会给出预期的结果。
答案 1 :(得分:0)
上面最初定义的search
更多的scalish方法,它们受益于功能不变性和Scala惯用元素。注意数组包含表达了预期的语义,
def search(e : Int, arr : Array[Int]): Int = if (arr contains e) e else -1
使用for comprehension我们在结果列表中找到元素并测试非空虚,
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
}
这里相关的是我们迭代arr
的每个元素而不必使用索引。还要考虑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
我们处理未找到的案例。