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

Yuv*_*uva 1 functional-programming scala tuples list pattern-matching

我是Scala的新手,并试图了解如何处理元组列表,所以我创建了一个虚构的人员列表:

val fichier = List(("Emma Jacobs","21"), ("Mabelle Bradley","53"), ("Mable Burton","47"))
Run Code Online (Sandbox Code Playgroud)

我想捕获每个元素(元组)的组件并将它们用于其他目的,所以我写了这个:

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)
    }

  }
Run Code Online (Sandbox Code Playgroud)

结果:空文件.

我误解了什么,因为我fichier不是空的?为什么它认为fichierNil

SCo*_*uto 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)
  }
Run Code Online (Sandbox Code Playgroud)

这是另一个选项,通过在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)
  }
Run Code Online (Sandbox Code Playgroud)

编辑:

以下是评论中建议的地图选项:

personne.map{case (name, age) => s"$name is $age years old"}.mkString(",")
Run Code Online (Sandbox Code Playgroud)

输出:

Emma Jacobs is 21 years old,Mabelle Bradley is 53 years old,Mable Burton is 47 years old
Run Code Online (Sandbox Code Playgroud)