【发布时间】:2017-08-17 14:34:28
【问题描述】:
我有两个列表,其中包含重要数量的对象,每个 N 元素:
List<Foo> objectsFromDB = {{MailId=100, Status=""}, {{MailId=200, Status=""}, {MailId=300, Status=""} ... {MailId=N , Status= N}}
List <Foo> feedBackStatusFromCsvFiles = {{MailId=100, Status= "OPENED"}, {{MailId=200, Status="CLICKED"}, {MailId=300, Status="HARDBOUNCED"} ... {MailId=N , Status= N}}
小见解:
objectFromDB 通过调用 Hibernate 方法检索我的数据库的行。
feedBackStatusFromCsvFiles 调用 CSVparser 方法并解组为 Java 对象。
我的实体类Foo 有所有的setter 和getter。所以我知道基本的想法是使用这样的 foreach:
for (Foo fooDB : objectsFromDB) {
for(Foo fooStatus: feedBackStatusFromCsvFiles){
if(fooDB.getMailId().equals(fooStatus.getMailId())){
fooDB.setStatus(fooStatus.getStatus());
}
}
}
就我对初级开发人员的了解而言,我认为这样做是一种非常糟糕的做法?我应该实现一个比较器并使用它来迭代我的对象列表吗?我还应该检查 null 案例吗?
感谢大家的回答!
【问题讨论】:
-
可能有更好的方法,但是根据您当前的实现,您至少应该休息一下; setStatus 之后的行,因为一旦找到匹配项,就没有必要检查列表中的其余对象。
-
如果你使用嵌套的
for循环,那么内部循环的主体将被执行 O(n^2) 次。如果元素的数量肯定很小,这可能没问题,但如果它可能增长到数百或数千个元素,那么它可能太昂贵了。 -
您确定这两个元素的计数相同吗?当您使用 N 时,我认为您将拥有相同的数字。否则我会期待 N 和 M 或类似的东西。
-
如果这两个列表都按
mailId排序,那么您可以以O(n)的成本协同迭代它们。但是,如果它们还没有已经以这种方式排序,那么首先对它们进行排序可能会花费O(n log n)。对于大于某个最小大小的列表,这在性能方面是值得的,但如果您的列表确实很小,则不是。 -
感谢大家的回答。我的列表确实会有大量的元素(一万个)。我的意思是 N ,我的列表中有 N 个可能的元素。 @JohnBollinger 列表根本没有按 mailId 排序,也没有按其他字段排序。我应该按照你的建议做吗?我的另一个重要问题是,我应该如何迭代?使用比较器或根据你们的每个?
标签: java performance for-loop collections java-8