问题描述
abstract class A{
Integer val;
}
class B extends A {...}
现在有一个 A 类对象的列表 1,我需要比较并检查它们的值和顺序是否相等,还有另一个列表 2 在对列表 1 应用某种排序后得到
B var1 = new B();
B.setVal(1);
B var2 = new B();
B.setVal(null);
B var3 = new B();
B.setVal(10);
B var4 = new B();
B.setVal(15);
List<B> list1 = Lists.newArrayList();
list2 = [null,1,5,10]
我可以使用什么方法来验证 list1list2 ?
当我尝试 equals() 时,它给了我 list1 == list2
解决方法
如果需要比较 List<B>
和 List<Integer>
的实例并考虑元素的顺序,首先需要检查两个列表的大小是否相同,然后比较两个列表中的每个元素在适当的位置使用 Objects.equals
,如果两个参数都是 true
,则可能返回 null
:
static boolean listsAreEqual(List<B> listB,List<Integer> listInts) {
return listB.size() != listInts.size() ? false :
IntStream.range(0,listB.size())
.allMatch(i -> Objects.equals(listB.get(i).getVal(),listInts.get(i)));
}
此外,当 B 的某个实例为 null
(不仅仅是它的 val
字段)并且适当的 Integer
为 null
时,您可能需要假设列表相等:
static boolean listsAreEqualWithNulls(List<B> listB,listB.size())
.allMatch(i ->
Objects.equals(
Optional.ofNullable(listB.get(i)).map(B::getVal).orElse(null),listInts.get(i)
));
}
,
这可能对您有用:
import java.util.*;
import java.util.stream.Collectors;
abstract class A{
Integer val;
public void setVal(Integer val) {
this.val = val;
}
public Integer getVal() {
return val;
}
}
class B extends A {
}
public class Test {
public static void main(String[] args){
List<B> list1 = new ArrayList<>();
B var1 = new B();
var1.setVal(1);
B var2 = new B();
var2.setVal(null);
B var3 = new B();
var3.setVal(10);
B var4 = new B();
var4.setVal(5);
list1.add(var1);
list1.add(var2);
list1.add(var3);
list1.add(var4);
List<Integer> list2 = Arrays.asList(new Integer[]{null,1,5,10});
List<Integer> list3 = list1.stream().map(B::getVal).collect(Collectors.toList());
System.out.println("Both list are equal "+list3.containsAll(list2));
}
}
这里我将 B
的对象的 bist 转换为 B.val
的列表,然后检查 list1
和 list2
中的所有值是否相等。