2016-10-20 97 views
1

我有一個零件列表以及組合零件列表。返回原始列表中包含的子列表的總數列表

我有一個汽車的零件清單,我想看看有多少組合屬於零件清單,並且還可以得到重量的總和。

所以我想返回hondaParts中包含的組合列表以及總重量。

case class Part(id: Int, weight: Int) 
case class Combo(parts: List[Part]) 

val part1 = Part(1, 1) 
val part2 = Part(2, 1) 
val part3 = Part(3, 2) 
val part4 = Part(4, 5) 
val part5 = Part(5, 3) 
val part6 = Part(6, 8) 
val part7 = Part(7, 2) 
val part8 = Part(8, 12) 
val part9 = Part(8, 1) 

val allParts = List(part1, part2, part3, part4, part5, part6, part7, part8, part9) 

val combo1 = List(part1, part2) 
val combo2 = List(part4, part2) 
val combo3 = List(part7, part8, part9) 
val combo4 = List(part3) 

val combos = List(combo1, combo2, combo3, combo4) 

val hondaParts = List(part1, part3, part4, part7, part8, part9) 

所以基本上我想要一個hondaParts列表中所有組合列表。然後我想獲得每個組合的重量總和。

我嘗試這樣做:

combos.forall(hondaParts.contains)

但隨後只是返回布爾。

+1

我相信你需要的是'combos.filter(_。forall(hondaParts.contains))' –

回答

2

就快,你只是想需要一個額外的filter讓你對每個組合的每個元素檢查hondaParts(而不是組合本身):

scala> combos.filter(_.forall(hondaParts.contains)) 
res0: List[List[Part]] = List(List(Part(7,2), Part(8,12), Part(8,1)), List(Part(3,2))) 

該讀作「選擇每個組合,這樣對於其每個元素,hondaParts都包含該元素「。

作爲一個附註,combos.forall(hondaParts.contains)是Scala中處理平等方式的一個不幸的人爲因素。詢問零件清單是否包含零件清單並沒有什麼意義,但編譯器會很樂意讓你在contains的情況下做到這一點,甚至沒有警告。您可以通過將預期的類型參數上contains使事情變得更安全了一點:

scala> combos.forall(hondaParts.contains[Part]) 
<console>:27: error: type mismatch; 
found : Part => Boolean 
required: List[Part] => Boolean 
     combos.forall(hondaParts.contains[Part]) 
             ^

但修正版本將編譯就好:

scala> combos.filter(_.forall(hondaParts.contains[Part])) 
res1: List[List[Part]] = List(List(Part(7,2), Part(8,12), Part(8,1)), List(Part(3,2))) 
1

以上的答案是正確的。但是你得到的是一個List[List[Part]]。爲了得到總和,您可以使用flattenfold。例如:

val parts = combos.filter(combo => combo.forall(p => hondaParts.contains(p))).flatten 
val sum = parts.foldLeft(0)((sum, part) => sum + part.weight) 
0

我想你的意思是使用組合情況類實例化COMBO1,combo2,combo3,combo4。然後解決方案很簡單:

case class Part(id: Int, weight: Int) 
case class Combo(parts: List[Part]) 

val part1 = Part(1, 1) 
val part2 = Part(2, 1) 
val part3 = Part(3, 2) 
val part4 = Part(4, 5) 
val part5 = Part(5, 3) 
val part6 = Part(6, 8) 
val part7 = Part(7, 2) 
val part8 = Part(8, 12) 
val part9 = Part(8, 1) 

val allParts = List(part1, part2, part3, part4, part5, part6, part7, part8, part9) 

val combo1 = Combo(List(part1, part2)) 
val combo2 = Combo(List(part4, part2)) 
val combo3 = Combo(List(part7, part8, part9)) 
val combo4 = Combo(List(part3)) 

val combos = List(combo1, combo2, combo3, combo4) 

val hondaParts = List(part1, part3, part4, part7, part8, part9) 

val filteredCombos = combos.filter(x => x.parts.intersect(hondaParts).size == x.parts.size) 

val comboWeights = filteredCombos.map(x => x.parts.foldLeft(0)((a,b) => a + b.weight))