2017-05-23 3 views
0

私はスカラー型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のサイズと各製品の数を掛けたものです。

例えば、私はこれらのエントリを有する:(4つのタスク* 1 PRODS)+(6つのタスク* 2 PRODS)を考慮してこれを有する

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 

を私は36個のエントリとのTaskScheduleのリストを返すべきです+(5タスク* 3プロード)+(5タスク* 1プロード)= 36タスクスケジュール

しかし、私はそうすることができません。

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

は誰も私を助けることができる:私が得た最も近い4つのタスクスケジュール(listTaskListsのサイズ)のリストを返していましたか?

+1

本当にあなたが質問していることはあなたの質問から確信が持てませんが、私の推測はあなたです'.flatMap'のための王。 'orders.map'の代わりに' orders.flatMap'を実行してみましょう。 – 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はに短縮することができます:あなたは、物事のリストを反復処理し、結果のリストは、異なる長さで持ちたい場合は、あなたがfoldを使用することができます

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

// 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 
} 
関連する問題