2017-05-05 16 views
1

私は問題を解決しようとしています:アイテムアソシエーションペアの入力を与えられた最大アイテムアソシエーションを出力する関数を記述してください。Scalaタプルのリストに基づいて連想リストを作成する方法

例入力:

[アイテム1、アイテム2]、 [アイテム2、ITEM3]、 [アイテム2、ITEM4]、 [Item5、Item6]

出力:[アイテム1、アイテム2、 ITEM3、ITEM4]

私はこれが私の最初の実装である、スカラ座を使用して、清潔で機能的なスタイルでそれを解決しようとしている:

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

機能をより明確に説明できますか?私は、「最大の商品協会」が何を意味しているかを理解するのが難しいです。あなたの例は理にかなっていません。入力内の1つのタプルごとに1つの出力項目が表示されますが、一貫した関係はありません。 – Tanjin

+1

問題は、タプルの最初の項目が階層 "item1"のルートを含んでいるタプル(String、String)のリストに基づいてストリングのリストを構築することです。結果リストでは1位になり、item1はitem2を指します。第2に、item2がitem3とitem4を指しているので、item3とitem4の両方が同じ「ランク」item5を持ち、item6はitem1に由来するカスケード階層の他の項目によって指されないので、結果リストには含まれません。 – guilhebl

+1

さて、私は今理解しています - その場合、あなたは難しい部分を既に(再帰アルゴリズムを作る)行ったようです。 jwvhはそれを '機能的な'形式で書き換えました(varsや副作用のない不変性、フィルタと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) 
} 
関連する問題