如何比较两个包含具有共享属性的对象的数组列表?

问题描述 投票:0回答:2

如何比较两个包含具有共享属性的对象的数组列表?

比如我有一个pojo类Abc:

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

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

我想比较 list1 数据字符串和 list2 数据字符串并返回 rownum if list1.dataString 注意等于 list2.dataString

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

java arraylist collections
2个回答
2
投票

概括而言,您的代码应该:

  • 迭代列表1
  • 对于每个元素检查其数据字符串是否出现在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());
}

0
投票

如果在这种情况下,您有两个不同的列表并想要进行比较,最简单的方法之一可以是两个具有相等条件的 foreach 循环,然后具有值:

for(Abc list1Obj : list1)
{
      for(Abc list2Obj : list2)
      {
          if(list1.dataString.Equals(list2.dataString))
          {
              int value = Integer.parseInt(list1.rowNumber);
          }
      }
}

在这种情况下,它将针对 list1 中的每个项目与 list2 中的每个项目。

© www.soinside.com 2019 - 2024. All rights reserved.