我是Scala的新手,并试图了解如何处理元组列表,所以我创建了一个虚构的人员列表:
val fichier = List(("Emma Jacobs","21"), ("Mabelle Bradley","53"), ("Mable Burton","47"))
我想捕获每个元素(元组)的组件并将它们用于其他目的,所以我写了这个:
def classeur(personne: List[(String, String)]) : String =
personne match {
case Nil => "Empty file"
case h :: t => {
h._1 + "is " + h._2 + "years old"
classeur(t)
}
}
结果:空文件。
我误解了什么,因为fichier
不是空的?为什么会将fichier
视为Nil
?
答案 0 :(得分:5)
您的代码几乎是正确的。唯一的问题是你忘了将String连接到递归调用的结果:
def classeur(personne: List[(String, String)]) : String =
personne match {
case Nil => "Empty file"
case h::t => h._1 + "is " + h._2 + "years old " + classeur(t)
}
这是通过在case语句中提取元组的值的另一个选项,我认为这可能更清楚:
def classeur(personne: List[(String, String)]) : String =
personne match {
case Nil => "Empty file"
case (name, age)::t => name + "is " + age + "years old " + classeur(t)
}
修改强>:
以下是评论中建议的地图选项:
personne.map{case (name, age) => s"$name is $age years old"}.mkString(",")
输出:
Emma Jacobs is 21 years old,Mabelle Bradley is 53 years old,Mable Burton is 47 years old
答案 1 :(得分:2)
因为你没有更新你的列表,你只是创建一个字符串(同时不做任何事情),然后在尾部递归。执行此操作直到找到空列表。
其他人告诉你如何按原样修复代码:只需将递归调用连接到字符串即可。
然而,我会考虑使用map
,它功能更强,更容易出错:
def classeur(personne: List[(String, String)]) : String =
personne.map { case (name, age) => s"$name is $age years old" }.mkString("\n")
这将从您的元组列表中创建一个String
列表,然后使用mkString
的参数加入它们,在这种情况下这是一个换行符。