Scala用if else返回布尔值

时间:2015-12-12 15:14:37

标签: scala function set boolean

所以我必须遵循以下方案:

 def check(): Boolean = {
    for ((digit1,digit2,digit3) <- SetOfDigits){
      if ((1,2,5) == (digit1,digit2,digit3))
        true
      else
        false
}
  }

val SetOfDigits = Set((0,2,3),(1,5,6),(7,10,2),(1,2,5))

现在的问题是该函数必须返回一个布尔值,但它总是告诉我这里的返回类型是Unit? 该函数应该迭代SetOfDigits,如果它找到类似(1,2,5)的东西,它应该返回true,否则为false? 有没有人能够解决这个问题以及为了让它发挥作用我必须做些什么?

4 个答案:

答案 0 :(得分:9)

我不同意V.先生的解决方案,我建议你改变实施方式,这似乎是处理事情的一种非常狡猾的方式:

scala> val SetOfDigits = Set((0,2,3),(1,5,6),(7,10,2),(1,2,5))
SetOfDigits: scala.collection.immutable.Set[(Int, Int, Int)] = Set((0,2,3), (1,5,6), (7,10,2), (1,2,5))

scala>   SetOfDigits.contains((1, 2, 5))
res0: Boolean = true

scala>   SetOfDigits.contains((1, 2, 4))
res1: Boolean = false

contains在你的集合中找到一个元素,如果元素不存在,则返回false,在我看来看起来好多了。

在回复您的评论时,我会将第一个列表展平,然后使用forAllcontains

scala> val setOfDigits1 = Set((0,2,3),(1,5,6),(7,10,2),(1,2,5)).flatMap { case(a,b,c) => Set(a,b,c)}
setOfDigits1: scala.collection.immutable.Set[Int] = Set(0, 5, 10, 1, 6, 2, 7, 3)

scala>   val setOfDigits2 =  Set(1,2,3,16,20,7)
setOfDigits2: scala.collection.immutable.Set[Int] = Set(20, 1, 2, 7, 3, 16)

scala>   val setOfDigits3 =  Set(1,2,3,10)
setOfDigits3: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 10)

scala>   setOfDigits2.forall(i => setOfDigits1.contains(i))
res8: Boolean = false

scala>   setOfDigits3.forall(i => setOfDigits1.contains(i))
res9: Boolean = true

请注意,我已将List[(Int, Int, Int)]的第一个列表展平为List[Int],然后forAll计算所有元素必须为true的谓词,并contains执行其余部分。

答案 1 :(得分:3)

您应该在true之前添加return语句,或者在第一次执行时添加false

否则,您可以使用yield从每个子集中收集结果(您将获得布尔值列表)

取决于您的期望。如果你想确保满足结果的子集至少,你的功能将如下所示:

def check(): Boolean = {
    val s = for ((digit1,digit2,digit3) <- SetOfDigits) {
      if ((1,2,5) == (digit1,digit2,digit3))
        return true
    }
    false
  }

答案 2 :(得分:2)

如上所述,从if-else得到结果,否则for comprehension返回Unit。与基于@EndeNeu API的方法类似,也可以考虑

xs.exists( _ == (1,2,5) )
Boolean = true

在找到第一个匹配项时停止对集合的迭代。

另请注意,按照惯例,集合的标记以小写字母开头,即setOfDigits而不是SetOfDigits,而类型和类是大写的。

答案 3 :(得分:2)

我同意Ende Neu的回答。

在一般情况下,您可以引入一个布尔变量,您在for-comprehension中检查以过早地结束它。我更喜欢使用return关键字。

def check(): Boolean = {
  var found = false
  for ((digit1,digit2,digit3) <- SetOfDigits if !found) {
    if ((1,2,5) == (digit1,digit2,digit3)) found = true
  }
  found
}