scala:类型不匹配(找到单位,你需要int)

时间:2015-10-22 09:01:31

标签: scala

刚开始使用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

2 个答案:

答案 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我们处理未找到的案例。