基于Java中父类中的元素也是按顺序验证2个列表是否相等

问题描述

我有一个 B 类,它扩展了 A 类

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

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 字段)并且适当的 Integernull 时,您可能需要假设列表相等:

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 的列表,然后检查 list1list2 中的所有值是否相等。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...