Si tengo dos matrices byte[]
, ¿hay una función incorporada para compararlas con el memcmp()
de ala C?equivalente de memcmp() en Java?
Respuesta
There's Arrays.equals().
No sé si la implementación de JVM realmente optimiza esto si existe una instrucción correspondiente en el hardware, pero lo dudo.
Además, si recuerdo mi C correctamente, strcmp funciona hasta un terminador nulo (por lo que es útil para cadenas C), la versión Arrays comparará toda la matriz ya que los programadores rara vez molestan con matrices terminadas en nulo. Sin embargo, podría escribir fácilmente su propia función si le importa el terminador nulo.
[Arrays.equals] [1]
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[], byte [])
El método java.util.Arrays.equals(byte[], byte[]) es su amigo.
Bueno, Arrays.equals()
es bueno, pero no se pueden comparar subrangos. En este caso, también hay una ruta a través de y más tarde .subList()
, pero no para primitivas como byte[]
.
Actualmente no hay direct memcmp()
equivalente. Aquí está discussion y tan pronto como sé que ya está en el mismo estado (15 años). La mayoría de las implementaciones 'nativas' se pueden lograr mediante mi opción a través del java.nio.ByteBuffer
(método wrap()
y luego equals()
). Pero es una gran cantidad de código.
Para las personas que no entienden completamente el tema: memcmp()
se implementa de forma dependiente de la plataforma, que es muy eficiente y nada en Java se acerca. Cualquier ciclo manual está muy lejos en términos de rendimiento, al menos debido a las verificaciones de rango de índice. Tal vez algún día las personas que vinieron de C/C++ incrustado estarán satisfechos con este tema :-).
más 1 para mencionar subrangos. En ese caso, uno podría usar 'Arrays.copyOfRange()' con 'Arrays.equals()' pero probablemente no sea eficiente de todos modos. –
Memcmp devuelve un int, menor, igual o mayor que cero si los primeros n bytes de s1 se encuentran, respectivamente, para ser menor que, para coincidir o ser mayor que los primeros n bytes de s2. Equals devuelve un booleano. No es la misma función. Además, memcmp compara bytes como caracteres sin signo.
creo que esto podría funcionar:
public int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if(b1[i] >= 0 && b2[i] >= 0)
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >= 0)
return -1;
if(b1[i] < 0 && b2[i] < 0){
byte x1 = (byte) (256 + b1[i]);
byte x2 = (byte) (256 + b2[i]);
return x1 - x2;
}
}
}
return 0;
}
(editar) De hecho, de la 2 parte complemento no es necesaria:
public static int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0))
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >=0)
return -1;
}
}
return 0;
}
¿No son el retorno 1 y el retorno -1 invertidos? –
- 1. memcmp intrínseco
- 2. violación de segmento inesperado en memcmp
- 3. __LINE__ equivalente en Java?
- 4. DebugBreak equivalente en Java?
- 5. xml.etree.ElementTree equivalente en Java
- 6. sprintf equivalente en Java
- 7. equivalente de DataTable en Java
- 8. equivalente de ungetc En java
- 9. de Java() equivalente en pitón
- 10. Java equivalente de OpenLayers
- 11. Java Map equivalente en C#
- 12. ¿Hay equivalente epoll en Java?
- 13. C# DateTime.Ticks equivalente en Java
- 14. Java System.currentTimeMillis() equivalente en C#
- 15. Bloques ObjectiveC equivalente en Java
- 16. Java Mahout equivalente en Python
- 17. ¿Equivalente a #define en Java?
- 18. NServiceBus equivalente en Java world
- 19. Java TreeMap equivalente en C#?
- 20. Python "Evento" equivalente en Java?
- 21. equivalente en Java de String.match de JavaScript()
- 22. Equivalente de IllegalArgumentException de Java en C++
- 23. Equivalente de HashSet de Java en PHP
- 24. equivalente en Java de struct.pack de Python?
- 25. ¿Hay una alternativa nativa de C++ al "memcmp" de C?
- 26. equivalente de java de swfobject
- 27. Equivalente de Java de Reflection.Emit
- 28. Yacc equivalente para Java
- 29. ¿Puedo usar memcmp dos cadenas de caracteres multibyte para comparar?
- 30. Anotación Java equivalente C#
Soy curioso para un caso en el que alguien podría anular por terminado su propia matriz en Java –
Nunca lo intenté, pero supongo que tal vez si se invocara un método nativo en C y se usara un buffer ... – Uri
¿De dónde vino strcmp? La pregunta era sobre memcmp, y tampoco puedo ver strcmp en las historias de edición. – laalto