假设我有一个看起来像这样的对象:
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);
}
}
很明显,这看起来非常效率低下。有没有更好的方法来处理这种情况?
最佳答案
一个解决方案:
- 通过遍历列表一次,使用 supermarketId 作为键构建本地超市的 Map
- 循环浏览云列表并进行比较,从 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/