Comparar duas matrizes de primitivos em Java?
-
08-07-2019 - |
Pergunta
Eu sei sobre Arrays.deepEquals (Object [], Object []), mas isso não funciona para tipos primitivos (devido limitações de matrizes e autoboxing, consulte este post relacionado ).
Com isso em mente, é esta a abordagem mais eficiente?
boolean byteArrayEquals(byte[] a, byte[] b) {
if (a == null && b == null)
return true;
if (a == null || b == null)
return false;
if (a.length != b.length)
return false;
for (int i = 0; i < a.length; i++) {
if (a[i] != b[i])
return false;
}
return true;
}
Solução
Mude sua primeira comparação a ser:
if (a == b)
return true;
Isto não só pega os casos "ambos nulos", mas também "comparar uma matriz para si" caso.
No entanto, para uma simples alternativa - use Arrays.equals
que tem sobrecargas para cada tipo primitivo. (A implementação é muito semelhante ao seu, a não ser que iça o comprimento de matriz fora do circuito No .NET que pode ser um anti-otimização, mas acho que os implementadores da biblioteca JRE provavelmente sabe melhor para o JVM:.)
Outras dicas
Eu acho que o mais eficiente deve ser o de usar os métodos auxiliares na Arrays classe, porque eles podem ser implementadas de forma mais inteligente. Portanto, neste caso, o uso
Arrays.equals(a, b);
Eu não sei se isso vai ajudar ninguém, mas isso parece estar funcionando:
if(type == type_BooleanArray) {
boolean eq = Arrays.equals((boolean[]) thisObj, (boolean[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_ByteArray) {
boolean eq = Arrays.equals((byte[]) thisObj, (byte[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_ShortArray) {
boolean eq = Arrays.equals((short[]) thisObj, (short[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_CharArray) {
boolean eq = Arrays.equals((char[]) thisObj, (char[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_IntArray) {
boolean eq = Arrays.equals((int[]) thisObj, (int[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_LongArray) {
boolean eq = Arrays.equals((long[]) thisObj, (long[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_FloatArray) {
boolean eq = Arrays.equals((float[]) thisObj, (float[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_DoubleArray) {
boolean eq = Arrays.equals((double[]) thisObj, (double[]) thatObj);
if(!eq) {
return false;
}
} else {
if(!thisObj.equals(thatObj)) {
return false;
}
}
Aparentemente array.equals(otherArray)
faz um array == otherArray
, e não o que você esperaria.