Scala如何基于元组列表构建关联列表
我试图解决一个问题:编写一个函数,在给定项目关联对输入的情况下输出最大的项目关联 输入示例: [[项目1,项目2], [项目2、项目3], [项目2、项目4], [项目5、项目6]] 输出:[项目1、项目2、项目3、项目4] 我正在尝试使用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
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以“功能性”格式重写了它(具有不变性,没有变量,也没有副作用,并使用过滤器和平面图链接列表上的功能)