合并列表+更新项目

时间:2014-10-20 10:55:11

标签: java

我有例如关注Lists

List<tst> listx; // tst object has properties: year, A, B, C, D 

year A B C D
------------
2013 5 0 0 0 // list1
2014 3 0 0 0

2013 0 8 0 0 // list2
2014 0 1 0 0

2013 0 0 2 0 // list3
2014 0 0 3 0

2013 0 0 0 1 // list4
2014 0 0 0 5

如果我使用addAll方法,则listTotal将为:

year A B C D
------------
2013 5 0 0 0 // listTotal
2014 3 0 0 0
2013 0 8 0 0
2014 0 1 0 0
2013 0 0 2 0
2014 0 0 3 0
2013 0 0 0 1
2014 0 0 0 5

如何将它们合并到listRequired,就像这样?

year A B C D
------------
2013 5 8 2 1 // listRequired
2014 3 1 3 5

3 个答案:

答案 0 :(得分:4)

使用Map<Integer, Tst>每年(地图的关键字)包含您今年所需的Tst作为结果。

遍历您的listTotal和每个Tst:

  • 如果Tst的年份尚未在地图中,则存储今年的Tst
  • 否则,从地图中获取Tst并将其与当前的Tst
  • 合并

最后,地图的values()就是您想要的listRequired

代码:

Map<Integer, Tst> resultPerYear = new HashMap<>();
for (Tst tst : listTotal) {
    Tst resultForYear = resultPerYear.get(tst.getYear());
    if (resultForYear == null) {
        resultPerYear.put(tst.getYear(), tst);
    }
    else {
        resultForYear.merge(tst);
    }
}
Set<Tst> result = resultPerYear.values();

答案 1 :(得分:0)

使用地图维护从年份到TST结构的映射 迭代列表中的每个项目,检索相应的TST结构并手动更新A / B / C / D属性

答案 2 :(得分:0)

您应该可以通过定义自定义合并方法来实现:

List<tst> merge (List<tst> listA, List<tst> listB)

将listA中每个元素的属性与listB中相同索引的元素合并。

在list1,... list4上迭代调用此方法以获取listRequired。