在保留原始数据的同时合并2个列表

时间:2016-07-01 18:39:52

标签: arraylist groovy

我不确定如何确定标题,但这就是情况。我有2个列表,DBList是DB值列表,NewList是要存储在DB中的新值列表。现在最棘手的部分是我只添加了不存在的DBList值,但如果DBList包含的值NewList不是我想要的话删除它们

基本上,NewList变为DBList,但我想保留DBList中已保留到数据库的所有适用的以前存在的数据

这就是我所拥有的并且有效,但我想知道是否有更好的方法。

    List<DeptMajors> DBList;
    List<DeptMajors> NewList;
    for(DeptMajors dm : NewList) {
        if(!DBList.contains(dm)) {
            DBList.add(dm);
        }
    }

    Iterator<DeptMajors> i = DBList.iterator();
    while(i.hasNext()) {
        DeptMajors dm = i.next();
        if(!NewList.contains(dm)) {
            i.remove()
        }
    }

因此,第一个循环会将NewList中的所有数据都放入DBList中,而这些数据并不存在。然后,下一个循环将检查DBList是否包含NewList中不存在的数据,并将其从DBList

中删除

1 个答案:

答案 0 :(得分:2)

好的,所以我不得不补课DeptMajors

import groovy.transform.*

@TupleConstructor
@ToString(includeNames=true)
@EqualsAndHashCode(includes=['id'])
class DeptMajors {
    int id
    String name
    int age
}

如果id匹配(并且没有其他字段)

,则此类相等

然后我们可以创建一个dbList(变量的小写初始char,否则Groovy有时会感到困惑并认为它是一个类)

def dbList = [
    new DeptMajors(1, 'tim', 21),
    new DeptMajors(2, 'raymond', 20)
]

并且newList包含更新的raymond(将被忽略),新条目alice(将被添加)而不包含tim(以便将被删除)

def newList = [
    new DeptMajors(2, 'raymond', 30),
    new DeptMajors(3, 'alice', 28)
]

然后我们可以计算出新的合并列表。这是dbListnewList的交集(因此我们将raymond保持在原始状态),添加到newList中的新元素,可以通过{dbList找到1}}远离它:

def mergedList = dbList.intersect(newList) + (newList - dbList)

这给出了我认为你想要的结果?

assert mergedList == [
    new DeptMajors(2, 'raymond', 20),  // unchanged
    new DeptMajors(3, 'alice', 28)     // new entry (tim is removed)
]

修改

或者正如BZ在评论中所说,你也可以使用:

def mergedList = newList.collect { e -> dbList.contains(e) ? dbList.find { it == e }: e}

或更短的:

def mergedList = newList.collect { e -> dbList.find { it == e } ?: e}