在特定属性上组合两个对象列表

时间:2014-07-11 09:41:11

标签: 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,]]
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可以有多个filterIds,触发器,阻塞和分析。

我看过但找不到合并这两个对象列表的方法。请帮忙

1 个答案:

答案 0 :(得分:1)

您需要两个步骤:

1)覆盖ReportItem的{​​{1}}方法,与另一个具有相同日期,国家/地区和运营商的ReportItem相比,返回true。

equals

1b)如果您无法修改ReportItem,请编写一个@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; } ,在Comparator<ReportItem>方法中返回0以匹配ReportItem。

2)迭代tcItems并检查每个项目是否包含在fcItems中(使用equals或比较器)。如果是,请同时选择compare并根据需要合并

ReportItems

现在你也可以使用带有过滤器/收集器的Java 8的流API,但我不会详细介绍它。