Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较包含具有共享属性的对象的两个arraylist_Java_Arraylist_Collections_Core - Fatal编程技术网

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

Java 如何比较包含具有共享属性的对象的两个arraylist,java,arraylist,collections,core,Java,Arraylist,Collections,Core,如何比较包含具有共享属性的对象的两个arraylist 我有一个Abc级的pojo Class Abc { String dataString ; int rowNum; ...... } Abc list1 contains - 2000 records & more sometimes Abc list2 contains - 60 records & more sometimes 我想比较list1数据字符串和list2数据字符串,并返回rownum 如果list1.d

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

我有一个Abc级的pojo

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

Abc list1 contains - 2000 records & more sometimes
Abc list2 contains - 60 records & more sometimes
我想比较list1数据字符串和list2数据字符串,并返回rownum 如果list1.dataString Notequals list2.dataString


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

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

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

在这种情况下,它将为列表1中的每个项目和列表2中的每个项目指定一个值

在高级术语中,您的代码应该:

  • 遍历列表1
  • 对于每个元素,检查其数据字符串是否出现在列表2中的某个位置
  • 如果是,请在结果中包含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);
}
已筛选列表(列表1、列表2){
var-dataStrings=setOf(list2.map(x->x.dataString));
var abcs=list1.filter(x->dataStrings.contains(x.dataString));
返回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());
}
已筛选列表(列表1、列表2){
Set dataStrings=list2.stream()
.map(x->x.dataString))
.collect(收集器.toSet());
返回list1.stream()
.filter(x->dataString.contains(x.dataString))
.map(x->x.rowNum)
.collect(Collectors.toList());
}

那么,您想要列表1和列表2中共享相同的
数据字符串的所有对象的
rowNums
?@BenjaminUrquhart是正确的,如果它在列表2中匹配,我需要列表1中的rowNumbers。我不喜欢列表2的行号。这是一个Java问题,不是C:)我的缺点是,对于转换,我记得我需要改变,但我认为在这种情况下,equals是正确的。不是吗?在Java中,方法名以小写字母开头。它应该是
等于
。上述解决方案适用于我的原始请求。对我原来的问题进行了一些小的更正。我想返回与数据字符串b/w list1和list2不匹配的rowNum。List2 rown num可以忽略。我对Streams的概念不太熟悉。我正在使用java 8I,我尝试返回list1.stream().filter(x->!dataStrings.contains(x.getDataString()).map(x->x.getRowNum()).collect(Collectors.toList());我想给返回列表中的每个rowNum添加+1。如何在streams中做到这一点。要了解更多关于Java streams的信息,请通过搜索“Java streams站点:oracle.com”和其他介绍阅读官方文档。贝尔东写的任何东西都是值得信赖的。