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)