如何使用scala对列表进行排序和合并?

问题描述:

我有两个不同的列表,其中包含不同的数据。 这里是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

假设你正在你的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