我有2个ReportItem对象列表:
tcItems [ReportItem [date=2014-07-11 08:00:00.000,operator=Vodafone,country=Irl,blocked=1,total=1,uniqTriggeredCount=1,], ReportItem [date=2014-07-11 08:00:00.000,operator=TMob,country=UK,blocked=2,total=4,uniqTriggeredCount=3,]]
fcItems [ReportItem [date=2014-07-11 08:00:00.000,filterid=1,country=Irl,operator=Vodafone,triggered=0,blocked=0,analysis=3,], ReportItem [date=2014-07-11 08:00:00.000,filterid=1,country=UK,operator=TMob,triggered=0,blocked=5,analysis=0,], ReportItem [date=2014-07-11 08:00:00.000,filterid=2,country=UK,operator=TMob,triggered=0,blocked=4,analysis=0,]]
我想从两个列表中创建一个新列表,以便tcItems中的任何reportItem具有与fcItems中的reportItem相同的日期,国家和运营商,从而在新列表中获得带有两个属性组合的reportItem对象。在上面的示例中,我想要:
newReportItems [ReportItem [date=2014-07-11 08:00:00.000,operator=Vodafone,country=Irl,blocked=1,total=1,uniqTriggeredCount=1,[filterid=1,triggered=0,blocked=0,analysis=3],], ReportItem [date=2014-07-11 08:00:00.000,operator=TMob,country=UK,blocked=2,total=4,uniqTriggeredCount=3,[filterid=1,triggered=0,blocked=5,analysis=0],[filterid=2,triggered=0,blocked=4,analysis=0],]
请注意,fcItems可以具有多个filterId,触发器,阻止和分析。
我看过但找不到合并这两个对象列表的方法。请帮忙
最佳答案
您需要2个步骤:
1)与具有相同日期,国家和地区和运营商的另一个ReportItem相比,覆盖ReportItem
的equals
方法以返回true。
@Override
public boolean equals(Object o) {
if (o instanceof ReportItem) {
ReportItem ri = (ReportItem) o;
if (this.getDate().equals(ri.getDate()) && ... // compare other attributes) {
return true;
}
}
return false;
}
1b)如果无法修改ReportItem,请编写一个
Comparator<ReportItem>
,该compare
在其ReportItems
方法中返回0以匹配ReportItems。2)遍历tcItems,并为每个项目检查它是否包含在fcItems中(使用equals或比较器)。如果是,请同时使用两个并将其组合
for (ReportItem ri : tcItems) {
ReportItem matchingRI = findMatchingRI(ri);
if (matchingRI != null) {
// merge
}
}
private ReportItem findMatchingRI(ReportItem ri) {
for (ReportItem fcItem : fcItems) {
if (fcItem.equals(ri))
return fcItem;
}
return null;
}
现在,您还可以将Java 8的流API与filter / collect一起使用,但是我将不对其进行详细介绍。