2011-02-24 22 views

Respuesta

19

Usando Guava, puede utilizar cualquiera de:

El UnsignedBytes comparador parece tener una forma optimizada utilizando Unsafe que utiliza si puede. Los comentarios en el código indican que puede ser al menos dos veces más rápido que una implementación Java normal.

+0

tenemos la solución en "Java", si es así por favor enviar un ejemplo de trabajo. – Deepak

+0

Como dice ColinD en el comentario de mi respuesta, mi solución es la misma que la no optimizada en Guava. Entonces puede usar directamente el mío, que es un ejemplo de trabajo, o seguir los enlaces de ColinD. – marcorossi

-2

Puede usar un comparador que comparta el Character.toLowerCase() de cada uno de los bytes del conjunto (suponiendo que el byte [] está en ASCII) si no necesita hacer la decodificación de caracteres usted mismo o use new String(bytes, charSet).toLowerCase() pero esto no es probable que sea eficiente.

-1

Supongo que el problema es solo con la comparación "byte vs. byte". Tratar con las matrices es sencillo, así que no lo cubriré. Con respecto a los bytes vs bytes, lo primero que pensé es que hacer esto:

public class ByteComparator implements Comparator<byte> { 
    public int compare(byte b1, byte b2) { 
    return new Byte(b1).compareTo(b2); 
    } 
} 

Pero eso no será lexicográfico: 0xFF (el byte firmado por -1) será considerado menor que 0x00, cuando es lexicográfico más grande. Creo que esto debería hacer el truco:

public class ByteComparator implements Comparator<byte> { 
    public int compare(byte b1, byte b2) { 
    // convert to unsigned bytes (0 to 255) before comparing them. 
    int i1 = b1 < 0 ? 256 + b1 : b1; 
    int i2 = b2 < 0 ? 256 + b2 : b2; 
    return i2 - i1; 
    } 
} 

Probablemente hay algo en commons-lang de Apache o bibliotecas Commons-matemáticas que hace esto, pero no sé si fuera poco la mano.

15

encontramos este bonito pedazo de código en Apache HBase:

public int compare(byte[] left, byte[] right) { 
     for (int i = 0, j = 0; i < left.length && j < right.length; i++, j++) { 
      int a = (left[i] & 0xff); 
      int b = (right[j] & 0xff); 
      if (a != b) { 
       return a - b; 
      } 
     } 
     return left.length - right.length; 
    } 
+0

Esto es básicamente lo que hace la versión no optimizada de 'UnsignedBytes.lexicographicalComparator()' de Guava. – ColinD

+1

Hmm, ¿por qué usaron 'i' y' j', cuando una variable hubiera sido suficiente. Además, almacenar 'int length = Math.min (left.length, right.length)' y comparar 'i

+0

es de esperar que el campo de longitud de la matriz sea tan caro – marcorossi

Cuestiones relacionadas