Aumentar el Rendimiento de la Ordenación

La ordenación de largas listas de palabras consume mucho tiempo. Si el algoritmo de ordenación compara cadenas repetidamente podemos acelerar el proceso utilizando la clase CollationKey.

Un objeto CollationKey representa una clave de ordenación para un String y un Collator dados. Comparar dos objetos CollationKey envuelve una amplica comparación de claves cortas que es más rápido que comparar objetos String con el método Collator.compare. Sin embargo, generar objetos CollationKey también necesita tiempo. Por lo tanto, si un String sólo va a ser comparado una vez, Collator.compare ofrece mejor rendimiento.

En el siguiente ejemplo, utilizamos un objeto CollationKey para ordenar un array de palabras. El código completo de este ejemplo está en el fichero llamado KeysDemo.java.

Creamos un array de objetos CollationKey en el método main. Para crear un CollationKey, se llama al método getCollationKey sobre un objeto Collator. No se pueden comparar dos objetos CollationKey que no sean originales del mismo objeto Collator. Aqui podemos ver el método main:

static public void main(String[] args) {

   Collator enUSCollator = Collator.getInstance(new Locale("en","US"));

   String [] words = {
     "peach",
     "apricot",
     "grape",
     "lemon"
   };

   CollationKey[] keys = new CollationKey[words.length];

   for (int k = 0; k < keys.length; k ++) {
      keys[k] = enUSCollator.getCollationKey(words[k]);
   }

   sortArray(keys);
   printArray(keys);
}
El método sortArray llama al método CollationKey.compareTo. Este método devuelve un entero menor que, igual que, o mayor que cero si el objeto keys[i] es menor que, igual que o mayor que el objeto keys[j]. Observa que hemos comparado los objetos CollationKey, no los objetos String del array original de palabras. Aquí puedes ver el código del método sortArray:
public static void sortArray(CollationKey[] keys) {

    CollationKey tmp;

    for (int i = 0; i < keys.length; i++) {
       for (int j = i + 1; j < keys.length; j++) {
          // Compare the keys
          if( keys[i].compareTo( keys[j] ) > 0 ) {
             // Swap keys[i] and keys[j]
             tmp = keys[i];
             keys[i] = keys[j];
             keys[j] = tmp;
          }
       }
    }
}
Hemos ordenado un array de objetosCollationKey, pero nuestro objetivo original era ordenar un array de objetos String. Para recuperar el String que representa a cada objeto CollationKey, llamamos al método getSourceString en el método displayWords:
static void displayWords(CollationKey[] keys) {

   for (int i = 0; i < keys.length; i++) {
      System.out.println(keys[i].getSourceString() + "  ");
   }
}
El método displayWords imprime las siguientes líneas:
apricot  
grape  
lemon  
peach  

Ozito