2014-09-19 67 views
0

我有兩個不同的列表,其中包含不同的數據。 這裏是lists-如何使用scala對列表進行排序和合並?

list1:[{"name":"name1","srno":"srno1"},{"name":"name2","srno":"srno2"}] 
list2:[{"location":"location1","srno":"srno2"},{"location":"location2","srno":"srno1"}] 

一個例子,這兩個列表具有共同的字段是「srno」,這是字符串類型。 我想映射srno上的列表,併合並這兩個列表,使得對應'srno:1'從list1到'srno:1'到列表2的記錄。

因此,文件列表會是這樣的:

[{"name":"name1","srno":"srno1","location":"location2"},{"name":"name2","srno":"srno2","location":"location2"}] 

我怎麼排序和合並這兩個列表來形成使用Scala的一個列表?

編輯: 將會有一對一的對應關係,即srno1將出現恰好一次在這兩個名單

+0

是否有列表間的一種一一對應,或能有一個名單上的'srno'沒有出現在其他的一些值? – 2014-09-19 06:34:27

+0

會有一對一的對應關係 – Vishwas 2014-09-19 06:36:29

+0

你的符號看起來不像斯卡拉。你在操縱JSON數據嗎?如果是的話,你使用什麼庫?如果不是,你可以給「list1」類型嗎? – sjrd 2014-09-19 07:14:32

回答

1

假設你正在你的JSON轉換爲case類,你可以用理解來做到這一點。

case class NameSrno(name: String, srno: String) 
case class SrnoLoc(srno: String, location: String) 
case class All(name: String, srno: String, location: String) 

def merge(nsl: List[NameSrno], sll: List[SrnoLoc]): List[All] = { 
    for { 
    ns <- nsl 
    sl <- sll 
    if (ns.srno == sl.srno) 
    } yield All(ns.name, ns.srno, sl.location) 
} 

用法:

val nsl = List(NameSrno("item1", "1"), NameSrno("item2", "2")) 
val sll = List(SrnoLoc("1", "London"), SrnoLoc("2", "Tokyo")) 

merge(nsl, sll) 
//> res0: List[test.SeqOps.All] = List(All(item1,1,London), All(item2,2,Tokyo)) 
+0

O(N^2)來實現它。如果列表很短,那很好。否則,按照srno的值對它們進行排序,將它們一起壓縮併爲O(n log n)進行線性合併 – 2014-09-19 07:29:27

+0

我同意。 OTOH,我不明白這是如何更有效的只是列表。 – 2014-09-19 07:35:30

+0

實際上,我預計這些名單會很短 – 2014-09-19 07:37:09

相關問題