合并2在scala中列出A over B.

时间:2014-06-18 15:16:14

标签: list scala merge immutability

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

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

1 个答案:

答案 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应该。