Scala如何根据元组列表构建关联列表



我正在尝试解决一个问题:编写一个功能,该功能将输出最大的项目关联,给定项目关联对。

示例输入:

[[item1,item2],[item2,item3],[item2,item4],[item5,item6]]

输出:[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中的功能风格最佳实践保持一致?

我认为这是做同一件事的更简洁和功能的方法。

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

最新更新