【问题标题】:merge 2 lists A over B in scala在scala中合并2个列表A over B
【发布时间】:2014-08-08 23:13:23
【问题描述】:

我有 2 个不可变案例类 A(source, key, value) 和 B(source, key, value) 当'source'和'key'不存在时,我想在B上添加A,从A添加到B,并且当'source'和'key'存在时,将B中的值替换为来自 A 的一个。与 php 中的“merge_array”函数在多维数组上工作的方式相同。

我尝试使用 'A.union(B).groupBy(.key)' 然后使用 'groupBy(.source)' 并获得第一个值。但后来我意识到,我永远无法确定第一个值永远是 A 的值。

我对 scala 还很陌生,我真的想不出如何从功能不可变的角度来做到这一点。

有人知道我该怎么做吗?

谢谢

编辑:

case class TranslationValue(source: String, key: String, value: String)

def main(args:Array[String]):Unit = {
    println(merge(data1.toSet, data2.toSet))
}

def merge(a: Set[TranslationValue], b: Set[TranslationValue]) = {
    a.union(b).groupBy(_.key).flatMap{ case (s, v) =>
       v.groupBy(_.source).flatMap{case (s1, v1) => {
         for (res <- 0 to 0) yield v1.head
       }
    }
  }
}

例子

data1 有这个数据

Set(
 TranslationValue(messages,No,No),
 TranslationValue(messages,OrdRef,Order Reference),
 TranslationValue(messages,OrdId,Order Id)
)

data2 有这个数据

Set(
 TranslationValue(messages,No,No),
 TranslationValue(messages,OrdRef,OrderRef)
 TranslationValue(messages,Name,Name)
)

把data1放在我想得到的data2上

List(
 TranslationValue(messages,No,No),
 TranslationValue(messages,OrdRef,Order Reference),
 TranslationValue(messages,OrdId,Order Id)
 TranslationValue(messages,Name,Name)
)

我知道我所做的事情可以做得更好,但就像我说的,我正在学习:)

【问题讨论】:

  • 案例类没有联合。 A 的真正类型是什么?
  • 你能显示一些实际的代码吗?我们需要查看类型、函数定义、输入/预期输出示例……
  • +1,这是一个很好的问题,但正如其他人指出的那样,您需要添加一些细节。
  • 您的返回类型是否故意为List[A](根据您的最后一个示例)而不是Set[A]?你为什么不坚持Set[A]
  • 从这里结果将被打印在一个文件中,因此返回 List[A] 的事实根本不是问题。我只是在使用 Set[A],所以我可以做 union 和 groupBy。但我不确定在 100% 的情况下,A 的值是否总是会覆盖 B 的值。所以如果你有更好的想法我该怎么做,我非常感谢:)

标签: list scala merge immutability


【解决方案1】:

你可以一次性分组:

def merge(a: Seq[TranslationValue], b: Seq[TranslationValue]) = {
  a.union(b).groupBy(t=>(t.key,t.source)).map(c=>c._2.head)
}

我认为您还可以覆盖 TranslationValue 的 equals 方法,以便在源和键相同时两个翻译值相等(还必须覆盖 hashcode 方法)。那么 a.union(b) 就足够了。

编辑:
似乎 Set 不能保证项目的顺序(Scala: Can I rely on the order of items in a Set?),但 seq 应该。

【讨论】:

  • 谢谢。这样就好多了。但是你确定这样当'key'和'source'匹配时'a'的值总是会“覆盖”'b'的值?通过进行 union 然后 groupBy,'a' 的值不可能排在第二位,'b' 的值首先,而不是得到 'a' 的值,而是我们得到 'b' 的值?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2021-02-18
相关资源
最近更新 更多