【问题标题】:How to sort and merge lists using scala?如何使用 scala 对列表进行排序和合并?
【发布时间】:2014-09-19 06:20:44
【问题描述】:

我有两个不同的列表,其中包含不同的数据。 这是列表的示例-

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' 到 list2。

所以文件列表是这样的:

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

如何使用 scala 对这两个列表进行排序和合并以形成一个列表?

编辑: 将存在一对一的对应关系,即 srno1 将在两个列表中仅出现一次

【问题讨论】:

  • 列表之间是否存在一一对应关系,或者一个列表中是否有一些srno 的值不会出现在另一个列表中?
  • 会有一一对应
  • 你的符号看起来不像 Scala。你在操作 JSON 数据吗?如果是,您使用什么库?如果没有,你能给出list1的类型吗?
  • 我正在处理 json 数据。我想从两个不同的列表中创建一个列表。我通过导入包在游戏框架中做到这一点 - play.api.libs.json

标签: scala sorting merge


【解决方案1】:

假设您将 json 转换为案例类,您可以使用 for comprehension 来执行此操作。

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))

【讨论】:

  • O(N^2),不过。如果列表很短,那很好。否则,根据 srno 的值对它们进行排序,将它们压缩在一起并为 O(n log n) 进行线性合并
  • 我同意。 OTOH,我看不出仅使用列表如何提高效率。
  • 我希望在实践中,列表会很短
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2022-01-08
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多