2017-05-23 30 views
0

我有一個類型爲Scala的Order列表。Scala:分別處理列表清單

case class Order(id: String, prod: Product, quantity: Int)

case class Product(id: String, name: String, tasks: List[Task])

我這樣做,我得到一個List(List[Task]))

val listTaskLists = orders.map(p => p.getProduct().tasks) 

現在我想返回類型TaskSchedule的名單。此列表將具有的條目數是listTaskLists乘以每個產品的數量的大小。

例如,我有這些項:

val order1 = new Order("ORD_1", product1, 1) // product1 has 4 tasks 
val order2 = new Order("ORD_2", product2, 2) // product2 has 6 tasks 
val order3 = new Order("ORD_3", product3, 3) // product3 has 5 tasks 
val order4 = new Order("ORD_4", product4, 1) // product4 has 5 tasks 

val orders = o1 :: o2 :: o3 :: o4 :: Nil 

在考慮具有這種我應該返回TaskSchedule的列表具有36個條目:(4個任務* 1個電棒)+(6個任務* 2個電棒) +(5任務* 3刺)+(5任務* 1刺)= 36任務時間表

但我不能這樣做。我得到的最接近的是4個任務計劃(listTaskLists的大小):

listTaskLists.map(s => new TaskSchedule(null, 1, 100 minute, 200 minute)) 

任何人都可以幫我嗎?

+1

從您的問題很難確定這是否真的是你問的,但我的猜測是你是廁所國王爲'.flatMap'。嘗試執行'orders.flatMap'而不是'orders.map',看看它是否給你你想要的。 – Dima

回答

1
val orders = List(order1, order2, order3, order4) // List[Order] 
       .map(ord => (ord.prod.tasks, ord.quantity)) // List[(List[Task], Int)] 
       .flatMap(t => createSchedules(t._1.size * t._2)) // List[TaskSchedule] 

def createSchedules(numSchedules: Int): List[TaskSchedule] = 
    List.fill[TaskSchedule](numSchedules)(new TaskSchedule(null, 1, 100 minute, 200 minute)) 

編輯orders可以縮短爲:

val orders = List(order1, order2, order3, order4) 
       .flatMap(ord => createSchedules(ord)) 

def createSchedules(ord: Order): List[TaskSchedule] = { 
    val numSchedules = ord.prod.tasks.size * ord.quantity 
    List.fill[TaskSchedule](numSchedules)(new TaskSchedule(null, 1, 100 minute, 200 minute)) 
} 
+0

這幫了我很多,謝謝。但是我仍然有一個問題:如果我想'createSchedules'具有Order類型的另一個參數,該怎麼辦? 如何在這裏發送訂單:'.flatMap(t => createSchedules(t._1.size * t._2))'?我想這樣做:'.flatMap(t => createSchedules(t._1.size * t._2,orders(index)))' –

+0

看看我幾分鐘前發佈的編輯,其中一個' order'在'flatMap'中可用。 – chunjef

+0

正是我想要的。再次感謝。 –

0

如果你想遍歷的事情列出來,並有結果列表是不同的長度,你可以使用一個fold

// This says that we are folding over the orders list, and turning it into a list of TaskSchedules (starting with an empty list of them) 
val taskSchedules = orders.foldLeft(List.empty[TaskSchedule]) { (taskSchedules, currentOrder) => 

    // This is where you put your logic for turning the currentOrder into a list of TaskSchedules 
    val newSchedules: List[TaskSchedule] = ??? 

    // Add these new schedules to the existing ones 
    taskSchedules ++ newSchedules 
}