java - 优化两个列表的比较和合并

标签 java algorithm optimization

我有两个 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/

相关文章:

optimization - Postgres 将字符串转换为数字

java - 我们可以在 Java 中创建自己的日期格式吗?

java - 如何在 Java Stream 上应用多个过滤器?

java - 使用 .exe 作为映射器 (Hadoop) 的一部分

Java垃圾收集困惑

c++ - 如何生成给定长度的字典字符串?

algorithm - 在快速排序中使用一次插入排序

在两个集合之间映射元素的算法

java - Java 中的正则表达式速度

c - 使用循环平铺和 OpenMP 进行优化