我有两个对象列表,我想将它们合并为一个。对象有两个字段,“名称”和“值”。对于 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)
(二次)。
您可以使用临时 LinkedHashMap
在 O(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/