由于某种原因,我遇到了一些麻烦。
我有两个java对象,它们都可以是任何东西,包括原始和非原始数组。
我需要执行等于检查。
如果它们是数组,那么我必须检查它们的内容而不是它们的运行时实例。
例如,假设我有一个方法:
/**
* Returns true if the two parameters are arrays, and they both contain
* the same content.
* @param aObject1 An object
* @param aObject2 An object
* @return
*/
private boolean equalsArray( Object aObject1, Object aObject2 ) {
if(aObject1==null){
return false;
}
if(aObject2==null){
return false;
}
if(!aObject1.getClass().isArray()){
return false;
}
if(!aObject2.getClass().isArray()){
return false;
}
//How do I check if the two arrays here contain the same objects
//without knowledge of their type???
}
请注意,数组可以是任何数组,很可能不是Object [],而是Foo []或Bar []。
有什么建议吗?我不能做Array.equals(Object [],Object []),因为我无法转换为Object []。
答案 0 :(得分:2)
使用java.lang.reflect.Array:
if (Array.getLength(first) != Array.getLength(second))
return false;
for (int i = 0; i < Array.getLength(first); ++i) {
Object firstItem = Array.get(first, i);
Object secondItem = Array.get(second, i);
if (!(firstItem == null ? secondItem == null : firstItem.equals(secondItem)))
return false;
}
return true;
答案 1 :(得分:1)
中有一个很好的等于实用程序
boolean org.apache.commons.lang.ArrayUtils.isEquals(Object array1, Object array2)
它会运行这样的东西 - 当然你不想手动编写: - )
public static boolean isEquals(Object array1, Object array2) {
return new EqualsBuilder().append(array1, array2).isEquals();
}
public EqualsBuilder append(Object lhs, Object rhs) {
if (isEquals == false) {
return this;
}
if (lhs == rhs) {
return this;
}
if (lhs == null || rhs == null) {
this.setEquals(false);
return this;
}
Class lhsClass = lhs.getClass();
if (!lhsClass.isArray()) {
// The simple case, not an array, just test the element
isEquals = lhs.equals(rhs);
} else if (lhs.getClass() != rhs.getClass()) {
// Here when we compare different dimensions, for example: a boolean[][] to a boolean[]
this.setEquals(false);
}
// 'Switch' on type of array, to dispatch to the correct handler
// This handles multi dimensional arrays of the same depth
else if (lhs instanceof long[]) {
append((long[]) lhs, (long[]) rhs);
} else if (lhs instanceof int[]) {
append((int[]) lhs, (int[]) rhs);
} else if (lhs instanceof short[]) {
append((short[]) lhs, (short[]) rhs);
} else if (lhs instanceof char[]) {
append((char[]) lhs, (char[]) rhs);
} else if (lhs instanceof byte[]) {
append((byte[]) lhs, (byte[]) rhs);
} else if (lhs instanceof double[]) {
append((double[]) lhs, (double[]) rhs);
} else if (lhs instanceof float[]) {
append((float[]) lhs, (float[]) rhs);
} else if (lhs instanceof boolean[]) {
append((boolean[]) lhs, (boolean[]) rhs);
} else {
// Not an array of primitives
append((Object[]) lhs, (Object[]) rhs);
}
return this;
}
答案 2 :(得分:0)
您可以使用
Arrays.equals(Object[] a, Object[] a2)
但是,您必须实现内容的等于,因为该方法具有:
o1.equals(o2)
只有在为该对象实现equals时才会有效。
对于非原始类型,有一个
Arrays.equals
覆盖每种基本类型。
答案 3 :(得分:0)
您可以使用Arrays.equal(..)
,或者,如果数组可以有嵌套数组Arrays.deepEquals(..)
答案 4 :(得分:0)
怎么样:
if(aObject1.getClass().getName().equals(aObject2.getClass().getName()))
return Arrays.equals(aObject1, aObject2);
else return false;