gpt4 book ai didi

java - 比较已存储为对象的数组

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:35 28 4
gpt4 key购买 nike

ObjectHolder 类型的对象中的多用途字段包含对象 objobj 可能存储一个包装原语或一个原语数组。如果两个 obj 是数组,我们如何比较它们?一个简化的例子:

import java.util.Arrays;

public class ObjectHolder {

public Object obj;

public static void main(String[] args) {

ObjectHolder oh1 = new ObjectHolder();
oh1.obj = new int[]{ 3, 4, 5 };

ObjectHolder oh2 = new ObjectHolder();
oh2.obj = new int[]{ 3, 4, 5 };

if (oh1.obj.getClass().isArray() && oh2.obj.getClass().isArray()) {
System.out.println("We know both objects are arrays.");
// System.out.println(Arrays.equals(oh1.obj, oh2.obj));
}
}

}

注释掉的行导致编译中断。

注意 - 数组可以是任何基本类型(或字符串),因此简单地将其转换为 int[] 并不是一个方便的通用解决方案。

最佳答案

在这种情况下,Java Reflections 将完成这项工作(来自问题 Java Array Comparison 的想法):

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class ObjectHolder {
public Object obj;

public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

ObjectHolder oh1 = new ObjectHolder();
oh1.obj = new int[] { 3, 4, 5 };

ObjectHolder oh2 = new ObjectHolder();
oh2.obj = new int[] { 3, 4, 6 };

if (oh1.obj.getClass().isArray() && oh1.obj.getClass().equals(oh2.obj.getClass())) {
Class<?> c = oh1.obj.getClass();

if (!c.getComponentType().isPrimitive()) {
c = Object[].class;
}

Method m = Arrays.class.getMethod("deepEquals", c, c);
System.out.println((Boolean) m.invoke(null, oh1.obj, oh2.obj));
}
}
}

更新

我认为@Andreas 在他编辑后的答案中指出的方式可能比使用 Java Reflections 更短、更好和更清晰的解决方案:

if(oh1.obj.getClass().isArray() && oh1.obj.getClass().equals(oh2.obj.getClass())) {
System.out.println(Arrays.deepEquals(new Object[] { oh1.obj }, new Object[] { oh2.obj }))
}

关于java - 比较已存储为对象的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40030085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com