Scala return 布尔值与 if else
Scala return boolean with if else
所以我必须遵循以下场景:
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))
现在的问题是函数必须 return 一个布尔值,但它总是告诉我这里的 return 类型是 Unit
?
该函数应该遍历 SetOfDigits
,如果它找到类似 (1,2,5)
的东西,它应该 return 为真否则为假?
有人知道这个问题的答案吗?我需要做什么才能让它正常工作?
您应该在 true 或 false
之前添加 return
语句以在第一次执行时停止。
否则,您可以使用 yield
从每个子集收集结果(您将获得布尔值列表)
取决于您的期望。如果您想确保 至少 个子集满足结果,您的函数将如下所示:
def check(): Boolean = {
val s = for ((digit1,digit2,digit3) <- SetOfDigits) {
if ((1,2,5) == (digit1,digit2,digit3))
return true
}
false
}
我不同意 Mr. V. 的解决方案,我宁愿建议您更改您的实现,这似乎是一种非常 Javish 的处理方式:
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
在你的集合中找到一个元素,如果该元素不存在,它 returns false,在我看来看起来好多了。
为了回应您的评论,我会展平第一个列表,然后使用 forAll
和 contains
:
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
计算一个谓词,该谓词必须对所有元素都为真,并且 contains
剩下的就做。
如前所述,产生 if-else
的结果,否则为理解 returns Unit
。与基于@EndeNeu API 的方法类似,还考虑
xs.exists( _ == (1,2,5) )
Boolean = true
这会在找到第一个匹配项时停止对集合的迭代。
还请注意,按照惯例,集合的标签以小写字母开头,即 setOfDigits
而不是 SetOfDigits
,而类型和 类 是大写的。
我同意 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
}
所以我必须遵循以下场景:
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))
现在的问题是函数必须 return 一个布尔值,但它总是告诉我这里的 return 类型是 Unit
?
该函数应该遍历 SetOfDigits
,如果它找到类似 (1,2,5)
的东西,它应该 return 为真否则为假?
有人知道这个问题的答案吗?我需要做什么才能让它正常工作?
您应该在 true 或 false
之前添加 return
语句以在第一次执行时停止。
否则,您可以使用 yield
从每个子集收集结果(您将获得布尔值列表)
取决于您的期望。如果您想确保 至少 个子集满足结果,您的函数将如下所示:
def check(): Boolean = {
val s = for ((digit1,digit2,digit3) <- SetOfDigits) {
if ((1,2,5) == (digit1,digit2,digit3))
return true
}
false
}
我不同意 Mr. V. 的解决方案,我宁愿建议您更改您的实现,这似乎是一种非常 Javish 的处理方式:
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
在你的集合中找到一个元素,如果该元素不存在,它 returns false,在我看来看起来好多了。
为了回应您的评论,我会展平第一个列表,然后使用 forAll
和 contains
:
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
计算一个谓词,该谓词必须对所有元素都为真,并且 contains
剩下的就做。
如前所述,产生 if-else
的结果,否则为理解 returns Unit
。与基于@EndeNeu API 的方法类似,还考虑
xs.exists( _ == (1,2,5) )
Boolean = true
这会在找到第一个匹配项时停止对集合的迭代。
还请注意,按照惯例,集合的标签以小写字母开头,即 setOfDigits
而不是 SetOfDigits
,而类型和 类 是大写的。
我同意 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
}