合并两个Arraylist&保留Java中的所有价值

时间:2017-07-18 12:45:10

标签: java arraylist collections

我有2 arrayList PresentErrorList& PastErrorList我们都有3个字段errorCodepresentErrorCount& pastErrorCount

presentErrorList

[errorCode=1000,presentErrorCount=10,pastErrorCount =0]
[errorCode=1100,presentErrorCount=2,pastErrorCount =0]

pastErrorList

[errorCode=1003,presentErrorCount=0,pastErrorCount =10]
[errorCode=1104,presentErrorCount=0,pastErrorCount =12]
[errorCode=1000,presentErrorCount=0,pastErrorCount =12]

在计算Present时,pastErrorCount = 0,反之亦然。我的finalArrayList应该是

[errorCode=1000,presentErrorCount=10,**pastErrorCount =12**]
[errorCode=1100,presentErrorCount=2,pastErrorCount =0]
[errorCode=1003,presentErrorCount=0,pastErrorCount =10]
[errorCode=1104,presentErrorCount=0,pastErrorCount =12]`

正如您在errorCode=1000的最终列表中所看到的那样,因为它在过去是重复的,所以只有一个对象同时存在&过去的错误计数。

1 个答案:

答案 0 :(得分:0)

所以找到方法并不容易,但结果是我做的事情:

public static void main(String[] args) {
    List<ErrorCodeModel> presentErrorList = new ArrayList<>();
    presentErrorList.add(new ErrorCodeModel("1000", 10, 0));
    presentErrorList.add(new ErrorCodeModel("1100", 2, 0));

    List<ErrorCodeModel> pastErrorList = new ArrayList<>();
    pastErrorList.add(new ErrorCodeModel("1003", 0, 10));
    pastErrorList.add(new ErrorCodeModel("1104", 0, 12));
    pastErrorList.add(new ErrorCodeModel("1000", 0, 12));

    Map<String, ErrorCodeModel> map = Stream.of(presentErrorList, pastErrorList)
                .flatMap(Collection::stream)
                .collect(Collectors.toMap(ErrorCodeModel::getErrorCode,
                      Function.identity(),
                      (oldValue, newValue)
                      -> new ErrorCodeModel(oldValue.getErrorCode(),
                           oldValue.getPresentErrorCount()+newValue.getPresentErrorCount(),
                           oldValue.getPastErrorCount()+newValue.getPastErrorCount())));

    List<ErrorCodeModel> errorList = new ArrayList<>(map.values());

    errorList.sort((err1, err2) //line 20*
                -> Integer.compare(Integer.parseInt(err1.getErrorCode()),
                                   Integer.parseInt(err2.getErrorCode())));

    System.out.println(errorList.toString());

    //*line 20 : Optionnal, if you want to sort by errorCode
    //(need to parse to int to avoir alphabetical order
}

所以在添加你的元素之后,就是这样做了:

  • 每个List的流已完成
  • 目标是将它们添加到Map :(对象代码,对象)
  • 使用(oldValue,newValue)lambda-exp是key总是在地图中,我告诉它添加一个新的Object,它有前一个和新添加的总和
  • 在地图之后,List会根据您的要求生成代表ErrorCodeModel的values