处理Scala中的元组列表 - 第1部分

时间:2018-02-14 10:53:26

标签: scala list functional-programming pattern-matching tuples

我是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

2 个答案:

答案 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的参数加入它们,在这种情况下这是一个换行符。