如何比较两个包含共享属性的对象的arraylist。

例如:我有一个pojo类Abc

Class Abc {
String dataString ;
int rowNum;
......
}

Abc list1 contains - 2000 records & more sometimes
Abc list2 contains - 60 records & more sometimes


我想将list1 dataString与list2 datastring比较并返回rownum
 如果list1.dataString注意等于list2.dataString

如果数据字符串不匹配,我需要List1的rowNumber。 List2 Rownum可以忽略。

最佳答案

用高级术语来说,您的代码应:


遍历list1
对于每个元素,检查其数据字符串是否出现在list2中的某处
如果是这样,则在结果中包括list1元素的行号


为了使代码更快,在第二步中,可以预先计算list2数据字符串集。仍然在高级方面,代码是:

List<int> filtered(List<Abc> list1, List<Abc> list2) {
    var dataStrings = setOf(list2.map(x -> x.dataString));

    var abcs = list1.filter(x -> dataStrings.contains(x.dataString));

    return abcs.map(x -> x.rowNum);
}


当然,在标准Java中,代码看起来更加肿:

List<int> filtered(List<Abc> list1, List<Abc> list2) {
    Set<String> dataStrings = list2.stream()
        .map(x -> x.dataString))
        .collect(Collectors.toSet());

    return list1.stream()
        .filter(x -> dataStrings.contains(x.dataString))
        .map(x -> x.rowNum)
        .collect(Collectors.toList());
}

09-29 22:35