【发布时间】: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