2017-05-05 56 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) 
}