我正在尝试解决一个问题:编写一个功能,该功能将输出最大的项目关联,给定项目关联对。
。示例输入:
[[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)
}