Java 如何比较包含具有共享属性的对象的两个arraylist
如何比较包含具有共享属性的对象的两个arraylist 我有一个Abc级的pojoJava 如何比较包含具有共享属性的对象的两个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
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元素的行号
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”和其他介绍阅读官方文档。贝尔东写的任何东西都是值得信赖的。