Java 结合特定属性上的两个对象列表
我有两个ReportItem对象列表: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,]]
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请格式化您的问题。这很难读