【发布时间】:2017-10-04 12:26:45
【问题描述】:
我正在尝试解决一个问题:编写一个函数,该函数将在给定项目关联对的输入的情况下输出最大的项目关联。
示例输入:
[[项目1,项目2], [项目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 中的函数式最佳实践保持一致?
【问题讨论】:
-
能把函数解释的更清楚一点吗?我很难理解“最大项目关联”的含义-您的示例没有意义。我在输入中看到每个元组一个输出项,但没有一致的关系。
-
问题是根据元组列表(字符串,字符串)构建一个字符串列表,其中元组的第一项包含层次结构“item1”的根,它应该是结果列表中的第一项,item1指向 item2,所以它是第二个,item2 指向 item3 和 item4,所以 item3 和 item4 都具有相同的“等级” item5 和 item6 没有被源自 item1 的级联层次结构中的任何其他项目指向,所以它们不是结果列表的一部分。
-
好的,我现在明白了 - 在这种情况下,您似乎已经完成了困难的部分(制作递归算法)。 jwvh 以“功能”格式重写了它(具有不变性,没有变量,也没有副作用,并且使用过滤器和 flatMap 在列表上链接函数)
标签: scala recursion functional-programming refactoring tuples