2012-09-28 173 views
5

Necesito ordenar las cadenas de una lista enlazada por la longitud de las cadenas, pero me gustaría mantener el orden de cadenas de la misma longitud (no ordenadas lexicográficamente).¿Cómo ordenar LinkedList <String>?

entrada

muestra:

this 
is 
just 
a 
test 

Ejemplo de salida:

a 
is 
this 
just 
test 

que estoy tratando de hacer esto con un método y una Comparable<LinkedList<String>>compareTo, pero no consigo la salida correcta (el mío todavía lo ordena lexicográficamente)

public class Q3_sorting implements Comparable<LinkedList<String>> { 
    Scanner keyboardScanner = null; 
    LinkedList<String> fileList = new LinkedList<String>(); 

// [...] algún código aquí

public int compareTo(LinkedList<String> o) { 
     // TODO Auto-generated method stub 
     o = fileList; 

     for (int i = 0; i < fileList.size() -1; i++) { 
      if (fileList.get(i).length() == o.get(i+1).length()) { 
       return 0; 
      } 
      if (fileList.get(i).length() > o.get(i+1).length()) { 
       return -1; 
      } 
      if (fileList.get(i).length() < o.get(i+1).length()) { 
       return 1; 
      } 

     } 

que luego usar
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); en mi método principal. entonces imprimir la lista a cabo ...

pero me da esto como resultado:

a 
is 
just 
test 
this 

¿cómo iba a rectificar este problema?

Respuesta

3

Está ordenando cadenas, no listas de cadenas.Para ello, es necesario definir un Comparator<String> para comparar dos cadenas por su longitud de la siguiente manera:

public class ByLength implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
    return a.length() - b.length(); 
    } 
} 

Entonces, para ordenar la lista, es necesario llamar a:

Collections.sort(sort.fileList, new ByLength()); 

También tenga en cuenta que la clasificación a LinkedList es muy ineficiente y debe usar un ArrayList en su lugar.

+0

Cualquier implementación razonable de 'Collections.sort' copiará los datos en una matriz antes de ordenarlos, y luego volverá a copiarlos. Sin embargo,' LinkedList' es generalmente ineficiente y generalmente debe evitarse. –

-1

Cadenas lamentablemente no tienen una propiedad que indique qué posición ocupan en una lista vinculada. Por lo tanto, deberá crear un objeto de datos personalizado que realice un seguimiento de esa información. O eso o escriba su propio método de clasificación personalizado para la lista vinculada y llámelo en lugar de Collections.sort().

6

Utilice la sobrecarga Collections.sort(list, comparator). Necesita un Comparator<String> no un Comparator<LinkedList<String>>. Tenga en cuenta que el javadoc de Collections.sort garantiza una clasificación estable (mantenga el orden de cadenas iguales, igual a la media igual según su comparador).

+0

Ah, de acuerdo. Qué estúpido de mí ... Gracias – user1706571

7

Debe crear un comparador:

public class Q3_sorting implements Comparator<String> { 
public int compare(String a, String b) { 
return a.length() - b.length(); 
} 

Y luego clasificarla con el método:

Collections.sort(list, new Q3_sorting()); 

Tenga en cuenta que lo que se quiere hacer es ordenar las cadenas dentro de la lista. Al implementar un comparador de List (o un similar, ya que funciona con el mismo propósito aquí), lo que le está diciendo a la JVM es que desea comparar diferentes listas.

También puede lograr su objetivo mediante la implementación de un Comparable en la clase para ordenar, pero no puede mientras Cadena sea definitiva para que no pueda extenderse. Por lo tanto, no hay otra manera que implementar un Comparador, que es más simple también :)

+0

El 'Comparator' también se puede usar simplemente para ordenar implementaciones' List', como para 'TreeSet' y' TreeMap'. – Brian

+0

Sí. También se puede usar para ordenar matrices, a través de la clase de utilidad Arrays, entre usos personalizados. – enTropy

Cuestiones relacionadas