Scala 基于案例对象的列表模式匹配添加过滤
我有一份男性和女性居民的名单要重复 如何在列表模式匹配中添加基于性别的过滤?(这样,Scala 基于案例对象的列表模式匹配添加过滤,scala,functional-programming,pattern-matching,tail-recursion,Scala,Functional Programming,Pattern Matching,Tail Recursion,我有一份男性和女性居民的名单要重复 如何在列表模式匹配中添加基于性别的过滤?(这样,countOldManFloor仅当居住者性别为男性时才会返回1,因此countOldManFloor(居住者女性)将返回0) 我尝试了案例居住者:男性::如果居住者.age>olderThen=>1和=incidents.filter()匹配{},但它不起作用我知道你需要的是一个30岁以上男性的计数器,所以我添加了一个性别条件检查 def countoldmanloor(居民:列表[居民]):Int={ de
countOldManFloor
仅当居住者性别为男性时才会返回1,因此countOldManFloor(居住者女性)
将返回0)
我尝试了
案例居住者:男性::如果居住者.age>olderThen=>1
和=incidents.filter()匹配{}
,但它不起作用我知道你需要的是一个30岁以上男性的计数器,所以我添加了一个性别条件检查
def countoldmanloor(居民:列表[居民]):Int={
def checkGender(居住者:性别):布尔值=居住者匹配{
case Male=>true
大小写=>false
}
@泰勒克
def循环(lst:List[Resident],cont:Int):Int={
lst匹配{
案例无=>cont
如果h.age>olderThen&&checkGender(h.gender)=>loop(tail,cont+1),则为案例(h::tail)
大小写=>循环(第一个尾部,续)
}
}
循环(0)
}
您可以在模式中匹配模式。在这种情况下,男性
模式,在居住者()
模式中,在列表的模式中:
模式
@tailrec
def countOldManFloor(inhabitants : List[Inhabitant]
,ageLimit : Int
,acc : Int = 0): Int = inhabitants match {
case Inhabitant(age,Male) :: tl if age > ageLimit =>
countOldManFloor(tl, ageLimit, acc + 1)
case _ :: tl => countOldManFloor(tl, ageLimit, acc)
case Nil => acc
}
countOldManFloor(inhabitantsBoth, olderThan) // 1
countOldManFloor(inhabitantsMale, olderThan) // 2
countOldManFloor(inhabitantsFemale, olderThan) // 0
请注意,我将olderThan
设置为已传递的参数。引用其定义空间之外的变量的方法是一种代码味道。您的方法不起作用,因为您没有添加任何内容,只能返回1和0。如果您不关心尾部递归,这可能会起作用:
def countOldManFloor(inhabitants: List[Inhabitant]): Int = inhabitants match {
case Inhabitant(age, Male) :: inhabitants if age > olderThan => countOldManFloor(inhabitants) + 1
case inhabitant :: inhabitants => countOldManFloor(inhabitants)
case Nil => 0
}
我认为您可以使用count
而不是任何递归来实现这一点,不过:
def countOldManFloor(inhabitants: List[Inhabitant]): Int =
inhabitants.count(inhabitant => inhabitant.age > olderThan && inhabitant.gender == Male)
Hi@techkuz,您想按性别和年龄进行检查,还是两者都要?我不明白,嗨,切玛。两者,我只需要计算年龄过滤过的男性Ghi@techkuz,因此如果我没有错的话,结果将是30岁以上男性的计数器。
def countOldManFloor(inhabitants: List[Inhabitant]): Int =
inhabitants.count(inhabitant => inhabitant.age > olderThan && inhabitant.gender == Male)