java - 如何比较两个对象列表之间的字段?

标签 java list collections

假设我有一个看起来像这样的对象:

public class Supermarket {

    public String supermarketId;
    public String lastItemBoughtId;

    // ...
}

我有两个超市列表,一个是“旧的”,另一个是“新的”(即一个是本地的,另一个是从云端检索的)。

List<Supermarket> local = getFromLocal();
List<Supermarket> cloud = getFromCloud();

我想找到所有 Supermarket 对象对(给定 supermarketId),它们的 lastItemBoughtId 彼此不同。

我想到的第一个解决方案是迭代第一个 List,然后在第一次迭代中迭代第二个,每次 local.get(i).supermarketId.equals (cloud.get(j).supermarketId),检查i元素的lastItemBoughtId是否与j的id不同> 元素。如果不同,我将整个 Supermarket 对象添加到新列表中。

为了更清楚,像这样:

List<Supermarket> difference = new ArrayList<>();
for (Supermarket localSupermarket : local) {
    for (Supermarket cloudSupermarket : cloud) {
        if (localSupermarket.supermarketId.equals(cloudSupermarket.supermarketId) &&
        !localSupermarket.lastItemBoughtId.equals(cloudSupermarket.lastItemBoughtId))
            difference.add(cloudSupermarket);
    }
}

很明显,这看起来非常效率低下。有没有更好的方法来处理这种情况?

最佳答案

一个解决方案:

  1. 通过遍历列表一次,使用 supermarketId 作为键构建本地超市的 Map
  2. 循环浏览云列表并进行比较,从 map 上查找本地超市。

即O(n) 而不是 O(n2)

这是一个两行解决方案:

Map<String, Supermarket> map = getFromLocal().stream()
    .collect(Collectors.toMap(s -> s.supermarketId, s -> s));
List<Supermarket> hasDiffLastItem = getFromCloud().stream()
    .filter(s -> !map.get(s.supermarketId).lastItemBoughtId.equals(s.lastItemBoughtId))
    .collect(Collectors.toList());

关于java - 如何比较两个对象列表之间的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698780/

相关文章:

r - 保留该列表(在 R 中)内没有适当子集的元素(来自向量列表)

swift - SubSequence 索引的兼容性

java - 我的 Comparable 实现出了点问题

java - 如何在移动 Sprite 时重新绘制小程序?

java - 将map传递给Jackon的valueToTree方法时将java.sql.Timestamp转换为StringNode

java - 如何对项目中导入的依赖项类的对象列表进行排序

python - 为什么是 string.join(list) 而不是 list.join(string)?

Java 8 列表到 map 的转换

c# - 在多个列表之一中更新对象的最佳方法

java - 为多模块微服务 Spring Boot 应用程序设置 swagger 文档