【问题标题】:Java: Most efficient way to find matching object values in two ArrayLists? [duplicate]Java:在两个 ArrayList 中查找匹配对象值的最有效方法? [复制]
【发布时间】:2013-10-28 17:38:44
【问题描述】:

我有两个对象数组列表:modelList 包含 Model 对象,entityList 包含 Entity 对象。 ModelEntity 对象都有一个名为 id 的属性。

我的目标是遍历modelList 中的每个Model,如果entityList 中的Entity 具有相同的id 值,则调用方法merge()

目前,我正在这样做:

for (Model model : modelList) {
    for (Entity entity : entityList) {
        if (model.getId().equals(entity.getId())) merge(entity, model);
    }
}

这似乎不是很有效,尤其是对于大型数据集。实现预期结果的更好方法是什么?

提前致谢!

【问题讨论】:

  • 正如 Rene 所回答的,散列通常比遍历列表更快。
  • list1.retainAll(List2) 应该为你做。
  • 谢谢。在这种情况下,retainAll() 方法将不起作用,因为 Model 和 Entity 是两个不同的对象类。

标签: java loops arraylist match


【解决方案1】:

对将id 映射到EntityEntity 对象使用Map<IdType, Entity>

也许您可以更改生成List<Entity> 的代码以返回Map

【讨论】:

  • 这让我走上了正确的轨道,我认为...
【解决方案2】:

也许您可以为您的模型构建一个地图模型并在其中搜索。

for(Entity entity: entityList) {
    Model model = models.get(entity.getId());
    if (model != null) {
        merge(entity, model);
    }
}

如果你的模型比实体少得多,这工作!

【讨论】:

  • 谢谢。在这种情况下,entity.getId() 不会返回用作 modelList.get() 参数的值。
【解决方案3】:

根据 René 的回答,我选择了这个:

Map<String, Model> modelMap = new HashMap<String, Model>();
for (Model model : modelList)
    if (!modelMap.containsKey(model.getKey())) modelMap.put(model.getKey(), model);

Iterator it = entityList.iterator();
while (it.hasNext()) {
    Entity entity = (Entity) it.next();
    String key = entity.getKey();
    if (modelMap.containsKey(key)) merge(entity, modelMap.get(key));
    else it.remove();
}

仍有待改进的答案...

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 2018-01-06
    • 2020-05-09
    • 2020-02-24
    • 2010-10-08
    • 2014-12-04
    • 2016-08-08
    • 2021-07-30
    • 2015-01-11
    相关资源
    最近更新 更多