我有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相比,覆盖ReportItemequals方法以返回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一起使用,但是我将不对其进行详细介绍。

08-18 14:09