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

时间:2017-05-05 22:54:01

标签: scala recursion functional-programming refactoring tuples

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

示例输入:

[[Item1,Item2], [第2项,第3项], [第2项,第4项], [第5项,第6项]]

输出:[Item1,Item2,Item3,Item4]

我正在尝试使用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中的功能样式最佳做法保持一致?

1 个答案:

答案 0 :(得分:2)

我认为这是做同样事情的更简洁和实用的方式。

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