有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中比较泛型方法中的数组?

我有一个在构造函数中使用两个泛型参数的类。我想实现一个方法来比较这个类的两个实例,如下代码所示

除了其中一个参数是数组外,它工作得非常好。我读过关于如何将数组与java.util.Arrays.equals(Object[] a, Object[] a2)进行比较的不同主题,但是由于我的参数没有定义为数组,所以我不能使用此方法

我的数组内容中如何返回“true”是相同的?或者可以将我的参数强制转换为使用java.util.Arrays.equals(Object[] a, Object[] a2)

public class Pair<U, V> {

    public final U first;
    public final V second;

    public Pair(U first, V second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        Pair<?, ?> myPair= (Pair<?, ?>) o;

        if (!first.equals(myPair.first) || !second.equals(myPair.second))
            return false;
        return true;
    }
}

共 (4) 个答案

  1. # 1 楼答案

    你可以这样做:

    • 使用here给出的指导来确定两个对象(这个和“其他”)是否都包含数组。当然,检测实际的成员类型意味着更多的工作
    • 当字段实际上是数组时,利用Array.equals()编写特定的比较代码

    但是不要搞错:让equals()实现正确,并使用继承和其他东西。。。这将是一个重大挑战

    例如:你认为一个int数组是否等于一个整数值列表(假设所有的值都是相同的)?或者嵌套数组呢

    这里真正的要点是:Java对数组没有深度相等,而且几乎不可能自己涵盖所有潜在的情况

  2. # 2 楼答案

    值得注意的是,据我所知,Java中没有任何集合——成对、列表、集合……-对这个案子做出让步。例如:

    List<Integer[]> one = Arrays.asList(
        new Integer[]{1}, new Integer[]{2}
    );
    List<Integer[]> two = Arrays.asList(
        new Integer[]{1}, new Integer[]{2}
    );
    System.out.println(one.equals(two));
    

    输出:false

    两个集合的相等只能由其元素的相等来决定。除此之外的任何事情都会让你的班级合同变得越来越模糊

    Java中的数组不重写equals。这是一个已经做出的设计决定。你的工作不是试图通过破解你的实现来纠正你认为是错误的决定

    所以,简而言之,你没有

  3. # 3 楼答案

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
    
        Pair<?, ?> myPair = (Pair<?, ?>)o;
    
        if (first.getClass().isArray() ^ first.getClass().isArray() || second.getClass().isArray() ^ second.getClass().isArray())
            return false;
        return deepEquals(first, myPair.first) && deepEquals(second, myPair.second);
    }
    
    private static boolean deepEquals(Object one, Object two) {
        if (one instanceof byte[])
            return Arrays.equals((byte[])one, (byte[])two);
        if (one instanceof char[])
            return Arrays.equals((char[])one, (char[])two);
        if (one instanceof short[])
            return Arrays.equals((short[])one, (short[])two);
        if (one instanceof int[])
            return Arrays.equals((int[])one, (int[])two);
        if (one instanceof long[])
            return Arrays.equals((long[])one, (long[])two);
        if (one instanceof boolean[])
            return Arrays.equals((boolean[])one, (boolean[])two);
        if (one instanceof float[])
            return Arrays.equals((float[])one, (float[])two);
        if (one instanceof double[])
            return Arrays.equals((double[])one, (double[])two);
        if (one instanceof Object[])
            return Arrays.equals((Object[])one, (Object[])two);
        return one.equals(two);
    }
    
  4. # 4 楼答案

    public class Fourth {
    
        public static void main(String[] args) {
    
            Integer a[] = {1,2,3,4,5};
            Integer b[] = {1,2,3,4,6,7};
    
            CompareArrays<Integer, Integer> comp = new CompareArrays<Integer, Integer>(a,b);
    
            comp.compareArrays();
    
        }
    }
    
    class CompareArrays<One extends Number, Two extends Number> {
    
        One[] array1;
        Two[] array2;
    
        CompareArrays(One[] ob1, Two[] ob2){
            array1 = ob1;
            array2 = ob2;
        }
    
        void compareArrays() {
    
            if(array1.length != array2.length) {
                System.out.println("Two arrays are not equal");
    
            }else {
    
                int flag = 0;
    
                for (int i = 0; i < array1.length; i++) {
    
    
                      if(array1[i] != array2[i]) {
                          flag =1;
                      }
                }
    
                if(flag == 0) {
                    System.out.println("Two arrays are equal");
                }else {
                    System.out.println("Two arrays are not equal");
                }
    
            }
        }
    }