我有2个不可变的案例类A(源,键,值)和B(源,键,值) 我想以这样的方式添加A而不是B来源'和'关键'不存在,从A添加到B以及何时来源'和'关键'存在将B中的值替换为A中的值。同样的方式' merge_array' php中的函数适用于多维数组。
我尝试使用' 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)
)
我知道我所做的事情可以做得更好,但就像我说的那样,我正在学习:)
答案 0 :(得分:2)
你可以一次性分组:
def merge(a: Seq[TranslationValue], b: Seq[TranslationValue]) = {
a.union(b).groupBy(t=>(t.key,t.source)).map(c=>c._2.head)
}
我认为您还可以覆盖TranslationValue的equals方法,以便在源和键相同时两个转换值相等(哈希码方法也必须被覆盖)。然后a.union(b)就足够了。
编辑:
似乎Set不保证项目的顺序(Scala: Can I rely on the order of items in a Set?),但是seq应该。