Scala计算某个对象在序列中出现的次数

xu3bshqb  于 2023-01-17  发布在  Scala
关注(0)|答案(2)|浏览(124)

我是Scala的新手,我正在尝试创建一个函数来计算某个对象在序列中出现的数量。在这个例子中,我们有一个序列,其中有1个Hippo和3个Tigers。我想知道序列中Tigers的数量。所以函数amountOfTigers的结果应该是一个整数:3.我想利用模式匹配和递归来解决这个问题,但我真的不知道怎么做。

sealed trait Animal

case class Hippo(name: String, age: Int) extends Animal
case class Tiger(name: String, age: Int) extends Animal
def amountOfTigers(animals: Seq[Animal]): Int = animals match {
    case head +: tail => if (head.isInstanceOf[Tiger]) println(head); amountOfTigers(tail)
  }
val data = Seq[Animal](
    Hippo("Mino", 4),
    Tiger("Justin", 1),
    Tiger("Jason", 20),
    Tiger("Sloop", 10)
  )
  amountOfTigers(data)

println用于测试目的。我现在得到的输出是:老虎(贾斯汀,1)老虎(杰森,20)老虎(单桅帆船,10)
我想知道一个序列中老虎的数量,在这个例子中是3。

s6fujrry

s6fujrry1#

如果你想避免递归(我个人建议在这种情况下--因为它只是一个普通的数据数组),我建议你使用一个循环,如下所示:

def amountOfTigers(animals: Seq[Animal]): Int = animals.count(_.isInstanceOf[Tiger])

如果你坚持使用递归,我建议使用@tailrec,就像Christian暗示的那样:

def amountOfTigersRec(animals: Seq[Animal]): Int = {
    @tailrec
    def rec_fun(tail: Seq[Animal], count: Int): Int = tail match {
      case Tiger(_, _) +: tail => rec_fun(tail, count + 1)
      case _ +: tail => rec_fun(tail, count)
      case Nil => count
    }

    rec_fun(animals, 0)
  }
gstyhher

gstyhher2#

这是一个例子:

sealed trait Animal

case class Hippo(name: String, age: Int) extends Animal
case class Tiger(name: String, age: Int) extends Animal

def amountOfTigers(animals: Seq[Animal]): Int = animals match {
  case Seq() => 0
  case Tiger(_, _) +: tail => amountOfTigers(tail) + 1
  case head +: tail => amountOfTigers(tail)
}

val data = Seq[Animal](
    Hippo("Mino", 4),
    Tiger("Justin", 1),
    Tiger("Jason", 20),
    Tiger("Sloop", 10)
  )
  
print(amountOfTigers(data))

您可能想要查看的内容:

相关问题