【问题标题】:Scala how to build an associative List based on a list of TuplesScala如何基于元组列表构建关联列表
【发布时间】: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


【解决方案1】:

我认为这是做同样事情的更简洁和实用的方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多