Java 结合特定属性上的两个对象列表

Java 结合特定属性上的两个对象列表,java,list,Java,List,我有两个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,]]

我有两个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中与fcItems中的reportItem具有相同日期、国家/地区和运算符的任何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、Triggered、Blocked和Analysis

我已经看过了,但找不到合并这两个对象列表的方法。请提供帮助

您需要两个步骤:

1) 覆盖
ReportItem
equals
方法,当与另一个具有相同日期、国家/地区和操作员的ReportItem进行比较时,返回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,请编写一个
比较器
,它在匹配ReportItem的
compare
方法中返回0

2) 遍历tcItems,并针对每个项检查它是否包含在fcItems中(使用equals或comparator)。如果是,则将这两个
ReportItems
合并到一起

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一起使用,但我不会详细介绍这一点。

ohhh请格式化您的问题。这很难读