我有两个 Bill
对象列表,它们的 date
字段表示创建账单的月份。我需要将一些对象从 bills
列表添加到 oldBills
。如果oldBills
列表中没有相同数据的账单,则添加账单。
我是这样实现的:
outer:
for (Bill bill : bills) {
Date billDate = bill.getDate();
for (Bill bill1 : oldBills) {
Date bill1Date = bill1.getDate();
if (Objects.equals(billDate, bill1Date)) {
continue outer;
}
}
newBills.add(bill);
}
oldBills.addAll(newBills);
但我认为这不是最好的方法。
您有什么想法,如何优化这个算法?
附:Java 7
最佳答案
由于 Bill 的 getDate() 必须是唯一的,我建议使用需要唯一键并且具有 O(1) 键访问权限的 Map。
Map<Date, Bill> oldBills = new HashMap<>();
oldBills.putAll(newBills);
你也可以使用循环
for(Bill bill : newBills)
oldBills.putIfAbsent(bill.getDate(), bill);
这将替换所有具有相同Date
的账单。 putAll
通常是一个 O(N)
操作,其中 N 是 newBills
您可以像这样从列表构建这些 map 。
// requires Java 8.
Map<Date, Bill> billByDate = bills.stream().collect(Collectors.groupingBy(Bill::getDate));
关于java - 优化两个列表的比较和合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36158913/