2015-01-19 7 views
0

Допустим, у меня есть список ниже [(String, String)]:Convert List [(String, String)] для отображения [String, карта [String, String]]

List((recap_items[4].invoice_items[0].id,6), 
(recap_items[4].invoice_items[1].id,7), 
(recap_items[4].invoice_items[1].qty,1), 
(recap_items[4].invoice_items[0].qty,1), 
(recap_items[4].invoice_items[1].sur_key,19), 
(recap_items[4].invoice_items[0].sur_key,17)) 

Как я могу преобразовать, что Список внизу Карта?

Map(
recap_items[4].invoice_items[0] -> Map(id -> 6, qty -> 1, sur_key -> 17), 
recap_items[4].invoice_items[1] -> Map(id -> 7, qty -> 1, sur_key -> 19) 
) 

Или есть ли лучшее представление для какой-либо группы, которая содержит список?

EDIT

case class Recap(recap_id: String, recap_date: Date, submitted_id:String, edited_id: String, recap_items: List[Recap_items]) 

case class Recap_items(product_name: String, product_id: String, qty: Int, unit_name: String, unit_multiplier: Int, sys_qty: Int, invoice_items: List[Invoice_items]) 

case class Invoice_items(sur_key: Long, id: Long, qty: Int) 

ТОК ПОДХОД

Ниже мой текущий подход, который дает мне Карта [String, List [String]]:

код:

flash.data.filterKeys(_.startsWith("recap_items["+i+"].invoice_items")).toList.sortBy(x => x._1).map{ 
      x => (x._1.split("""\.""").toList(1), x._2) 
     }.groupBy(_._1).mapValues{ 
      x => x.map(v => v._2) 
     } 

:

Map(invoice_items[1] -> List(7, 1, 19), 
invoice_items[0] -> List(6, 1, 17)) 

Улыбка Как улучшить код?

+1

Можете ли вы опубликовать определение класса в 'invoice_items'? – ale64bit

+1

mmm, что именно означает «Карта (id -> 6, qty -> 1, sur_key -> 17)» для вас? Строки 'id' и' qty' или имена полей напрямую или что-то еще в этом выражении? Какова мотивация этого преобразования, чтобы узнать, есть ли более подходящий вариант? – ale64bit

+1

Что вы пробовали? Как только вы разделите строку, groupBy, похоже, делает большую часть того, что вы хотите. –

ответ

1

Не знаете, почему вы хотите преобразовать все в строку (я имею в виду, recap_items [4] .invoice_items [1] вместо фактического имени элемента).

Если вход является Recap объект, то вы можете просто сделать:

val recap: Recap = ... 
val map: Map[String, Map[String, String]] = 
    (for (
    (recapItem, recapItemIndex) <- recap.recap_items.zipWithIndex; 
    (invoiceItem, invoiceItemIndex) <- recapItem.invoice_items.zipWithIndex 
) yield { 
    s"recap_item[$recapItemIndex]invoiceItem[$invoiceItemIndex]" -> Map("id" -> s"$invoiceItem.id", "qty" -> s"$invoiceItem.qty", "sur_key" -> s"$invoiceItem.sur_key") 
    }).toMap 
Смежные вопросы