2016-09-22 12 views
0

初心者のScalaの質問。2つのリスト(Scala)で共通項目を検索

私はケースクラス

case class weightedFruits(fruits: Set[String], weight: Double) 

2つのリストを持っている操作を行うと、新しいリストに

を作成するよりも、一般的な項目を見つけ、二つのリストを受け取る機能を実装しようとしているweightedFruitsListそしてfilteredWeightedFruitsList

// set is sorted 
val weightedFruitsList = List(
weightedFruits(Set("banana"), 200), 
weightedFruits(Set("banana", "orange"), 180), 
weightedFruits(Set("banana", "orange", "apple"), 170), 
weightedFruits(Set("feijoa", "fig"), 201)) 


//filtered List , Set sorted, contains "melon" as last member 
val filteredWeightedFruitsList = List(
weightedFruits(Set("banana", "melon"), 250), 
weightedFruits(Set("banana", "orange", "melon"), 270), 
weightedFruits(Set("banana", "orange", "apple", "melon"), 365)) 

私はで同じアイテムを見つけ、filteredWeightedFruitsListの各項目の上に行きたいです私は2つの問題をしました。このコードで

def conf :Option[List[weightedFruits]] = { 

    for (filtered <- filteredWeightedFruitsList){ 

    weightedFruitsList.find{ 

     case x if (x.fruits equals filtered.fruits.dropRight(1)) => return weightedFruits(x.fruits, x.weight/filtered.weight)] 
     case _ => false 
    }  
    }  
} 

: 1)type mismatch; found : Unit required: Option

2)は、コード、小さな操作を行うと、(まだ動作していない)新しいList[weightedFruits]

私を作成します

ご迷惑をおかけしておりません。申し訳ありませんが、私の質問があなたを怒らせる場合...

最後の質問多分、この仕事をするより効率的な方法がありますか?

おかげ

+0

を使用していくつかのフィールドを上書きします。そのためには[SortedSets](http://docs.scala-lang.org/overviews/collections/sets.html#sorted-sets)が必要です – hasumedic

+0

希望の関数のシグネチャ、入力、出力の例を挙げてください?例 'def add1(x:Int):Int'、入力:' add1(42) '、出力:' 43'。 –

+0

希望の関数入力2つの 'List [weightedFuits]'、出力もリストです。 'def conf(フィルタリング:List [weightedFruits]、full:List [weightedFruits]):リスト[weightedFruits]' – Toren

答えて

2

type mismatch; found : weightedFruits required: Option[List[weightedFruits]]Option[List[weightedFruits]]タイプの結果を返さないあなたconf方法によって引き起こされます。おそらく、これを行うにはfor yieldを試してみてください。

def conf :List[weightedFruits] = for { 
    f <- filteredWeightedFruitsList 
    t <- weightedFruitsList.find(i => f.fruits.dropRight(1) == i.fruits) 
} yield t.copy(weight = t.weight/f.weight) 

copy方法はcase classをコピーして、セットがソートされていないことは注目に値するかもしれないname

+0

't.copy'についていくつかの言葉を追加してください。 – Toren

関連する問題