2016-09-22 85 views
0

新手Scala問題。查找兩個列表(Scala)中的常見項目

我試圖實現接收兩個列表的功能,找到一個共同的項目,不是讓操作和創建新的列表

我有一個案例類

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

和兩個列表weightedFruitsListfilteredWeightedFruitsList

// 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,發現相同的項目3210,做一個小的操作,並創建一個新的List[weightedFruits]

我(還沒有成型)代碼:

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)type mismatch; found : weightedFruits required: Option[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

所需函數輸入兩個'List [weightedFuits]',輸出也是列表。 'def conf(過濾:列表[加權水果],全部:列表[加權水果]):列表[加權水果]' – Toren

回答

2

type mismatch; found : weightedFruits required: Option[List[weightedFruits]]由您conf方法會造成不返回Option[List[weightedFruits]]類型的結果。也許你可以嘗試使用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