Scala如何基于元组列表构建关联列表

Scala如何基于元组列表构建关联列表,scala,recursion,functional-programming,refactoring,tuples,Scala,Recursion,Functional Programming,Refactoring,Tuples,我试图解决一个问题:编写一个函数,在给定项目关联对输入的情况下输出最大的项目关联 输入示例: [[项目1,项目2], [项目2、项目3], [项目2、项目4], [项目5、项目6]] 输出:[项目1、项目2、项目3、项目4] 我正在尝试使用Scala以干净和功能性的方式解决它,这是我的初始实现: object Main { def main(args: Array[String]) { val m = List[(String,String)]("item1" -> "item

我试图解决一个问题:编写一个函数,在给定项目关联对输入的情况下输出最大的项目关联

输入示例:

[[项目1,项目2], [项目2、项目3], [项目2、项目4], [项目5、项目6]]

输出:[项目1、项目2、项目3、项目4]

我正在尝试使用Scala以干净和功能性的方式解决它,这是我的初始实现:

object Main {
  def main(args: Array[String]) {
    val m = List[(String,String)]("item1" -> "item2", 
        "item2" -> "item3",
        "item2" -> "item4",
        "item5" -> "item6")

    val l: List[String] = getAssociationList(m)    
    l.foreach((s) => println(s))
  }

  def getAssociationList(l:List[(String,String)]) : List[String] = {    
    def f(k:String, l:List[(String,String)]) : List[String] = {
      var list:List[String] = List(k)
      l.filter((t:(String,String)) => t._1.equals(k)).foreach(
          {case (key, value) => list = list ++ f(value, l)}
      )
      return list
    }
    f(l(0)._1, l)
  }
}
它输出正确的结果,但是


我使用的是
var list:list[String]=list(k)
,这显然是不起作用的,有没有办法改进这个函数,使它更干净,更好地与Scala中的函数式最佳实践保持一致?

我认为这是一种更简洁、更实用的方法

def getAssociationList(l:List[(String,String)]) : List[String] = {
  def f(k:String) : List[String] =
    k :: l.filter(_._1 == k).flatMap(x => f(x._2))

  f(l.head._1)
}

你能更清楚地解释一下这个功能吗?我很难理解“最大项目关联”是什么意思——你的例子毫无意义。我在输入中看到每个元组有一个输出项,但没有一致的关系。问题是要根据元组列表(字符串,字符串)构建一个字符串列表,元组的第一项包含层次结构“item1”的根,它在结果列表中应该是第一项,item1指向item2,所以它是第二项,item2指向item3和item4,因此,item3和item4都具有相同的“排名”,item5和item6没有被来自item1的级联层次结构中的任何其他项指向,因此它们不是结果列表的一部分。好的,我现在明白了——在这种情况下,看起来您已经完成了困难的部分(制作递归算法)。jwvh以“功能性”格式重写了它(具有不变性,没有变量,也没有副作用,并使用过滤器和平面图链接列表上的功能)