2017-05-05 24 views
1

列表我试图解决一个问题上的关联列表:编写将输出最大项关联特定项目关联配对的输入功能。斯卡拉如何构建基于元组

示例输入:

[[项目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" -> "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的功能性风格的最佳做法,更清洁和更一致的方式?

+1

你能更清楚地解释功能?我很难理解'最大项目关联'的含义 - 你的例子没有意义。我在输入中看到每个元组有一个输出项,但没有一致的关系。 – Tanjin

+1

问题是要建立基于元组(字符串,字符串)的元组的第一项包含层次的根名单上的字符串列表“物品1”应该在结果列表中,物品1点ITEM2月1日,所以说到第二,item2指向item3和item4,因此item3和item4都具有相同的“rank”,item5和item6不会从源自item1的级联层次结构中的任何其他项指向,因此它们不是结果列表的一部分。 – guilhebl

+1

好吧,我现在明白了 - 在这种情况下,您似乎已经完成了困难的部分(制作递归算法)。 jwvh以'功能'格式重写了它(具有不变性,没有变量,也没有副作用,并且使用过滤器和flatMap在列表上链接函数) – Tanjin

回答

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