java - 如何通过比较 Java 中给定对象中的字段值来合并两个对象列表

标签 java arraylist merge

我有两个对象列表,我想将它们合并为一个。对象有两个字段,“名称”和“值”。对于 list2 中的给定 obj2,如果我们在 list1 中找到 obj1 的“名称”字段的匹配项(obj1 来自 list1,obj2 来自 list2),那么我们使用 obj2 的“值”来覆盖 obj1。如果没有找到匹配项,那么我们将 obj2 添加到 list1。最终输出将更新为 list1。

有什么快速的方法吗?我能想到的就是用两个for循环来比较两个列表中的所有对象

class NameValueObj{
String name;
String value;
}

List<NameValueObj> merge(List<NameValueObj> list1, List<NameValueObj> list2){
// I want to merge two list here
}

NameValueObj 是给定的,所以我不能修改对象源。

这是我的做法。

private List<Header> mergeHeaders(List<Header> defHeaders, List<Header> ovrdHeaders) {
        List<Header> lFinal = defHeaders;
        boolean foundMatch = false;
        for (Header ovrdHeader : ovrdHeaders) {
            foundMatch = false;
            for (Header defHeader : defHeaders) {
                if (defHeader.getName().equalsIgnoreCase(ovrdHeader.getName())) {
                    defHeader.setValue(ovrdHeader.getValue());
                    foundMatch = true;
                    break;
                }
            }
            if(!foundMatch) {
                lFinal.add(ovrdHeader);
            }

        }

        return lFinal;
    }

header 具有名称和值字段。 header 在给定列表中具有唯一名称。

最佳答案

您的算法是 O(n*n)(二次)。

您可以使用临时 LinkedHashMapO(n) 中完成(线性):

private List<Header> mergeHeaders(final List<Header> defHeaders, final List<Header> ovrdHeaders) {
    final Map<String, Header> headersMap = new LinkedHashMap<String, Header>();

    for (final Header defHeader : defHeaders) {
        headersMap.put(defHeader.getName().toLowerCase(), defHeader);
    }

    for (final Header ovrdHeader : ovrdHeaders) {
        headersMap.put(ovrdHeader.getName().toLowerCase(), ovrdHeader);
    }

    return new ArrayList<Header>(headersMap.values());
}

请注意,该行为与您的实现行为并不完全相同。 不同之处在于:

  • 此实现返回一个新的列表实例,而不是修改第一个列表。 IMO,这是一个好处,但这可能取决于。如果需要,您可以按如下方式修改第一个列表(尽管我推荐这样做):

    defHeaders.clear();
    defHeaders.addAll(headersMap.values());
    return defHeaders;
    
  • 此实现假设 header 名称在两个 列表中已经是唯一的(不区分大小写),而您的列表并未做出此假设。
    如果 header 名称​​不唯一,此实现将保留列表 1 或列表 2 中的最后一个 header 。

关于java - 如何通过比较 Java 中给定对象中的字段值来合并两个对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28466357/

相关文章:

java - 首次访问静态数组列表

java - Android Studio 执行失败

java - 为什么这个 mysql 插入在 java JDBC 中失败

java.util.Vector - 替代品

mysql - 合并或移动事件 MySql 数据库的方法

git - 如何从另一个分支完全替换 Git 中的 master 分支?

r - 在 R 中合并大数据集并标记不匹配的数据集

java - 如何创建一个模拟 SSH shell 用户交互的机器人?

java - 如何在 Java 2D 游戏中制作 Sprite 的透明部分?

java - 将字符串转换为数组