我正在尝试解决一个问题:编写一个函数,在给定项目关联对的输入的情况下输出最大的项目关联。
示例输入:
[[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中的功能样式最佳做法保持一致?
答案 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)
}