2012-10-07 54 views
7

Debajo del código que estoy usando funciona muy bien y muestra los nombres, excepto que el método de clasificación no funciona. Esperaba "Collections.sort (nameFromText);" para ordenar ArrayList en orden alfabético por nombre.Ordenando una ArrayList of Person con colecciones java

¿Qué estoy haciendo mal?

public static void main(String[] args) throws IOException { 
    // Create and populate text file 
    Writer textFile = new FileWriter("names.txt"); 
    String[] nameArray = new String[] { "Tina Tully\n", "Bill Simpson\n", 
      "Dana Smith\n", "Ralph Andrews\n", "Greg Smithers\n", 
      "Lisa Krump\n", "Gill Bitters\n", "Barbara West\n", 
      "Sandra McDonald\n", "Bart Willis\n", "Bucky Zimmerman\n", 
      "Richard Vicks\n", "Velma Tarp\n", "Winslow Tunnell\n", 
      "Andrew Letterman\n", "Betty Trump\n", "Waldo Smith\n", 
      "Kyle Ronno\n", "Vivian West\n", "Wendy Tunnell\n" }; 
    generateText(textFile, nameArray); 

    // Create object of previously created text file 
    Scanner pullFile = new Scanner(new File("names.txt")); 

    // Create 20 Person Objects and add to ArrayList data structure with 
    // name variables assigned to values from text file 
    ArrayList<Person> nameFromText = new ArrayList<Person>(); 
    fillArrayList(nameFromText, pullFile); 

    // Sort ArrayList 
    Collections.sort(nameFromText); 

    // Print ArrayList 
    printNamesFromObjects(nameFromText); 
} 

private static void printNamesFromObjects(ArrayList<Person> namesFromText) { 
    for (int i = 0; i < 20; i++) { 
     System.out.println(namesFromText.get(i).name); 
    } 
} 

private static void fillArrayList(ArrayList<Person> nameFromText, 
     Scanner pullFile) { 
    while (pullFile.hasNext()) { 
     Person obj = new Person(pullFile.nextLine()); 
     nameFromText.add(obj); 
    } 
} 

private static void generateText(Writer textFile, String[] nameArray) 
     throws IOException { 
    for (int i = 0; i < 20; i++) { 
     textFile.write(new String(nameArray[i])); 
    } 
    textFile.close(); 
} 
+0

Lo encontrará útil. http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/ and http://www.thejavageek.com/2013/06/17/sorting-user-defined -objects-part-2/ –

Respuesta

26

Collections.sort(List<T>) método espera que el elemento de la lista que es la selección para ser comparables. O bien el elemento tipo T debe implementar la interfaz Comparable, o debe usar el método sort() sobrecargado, que toma una instancia genérica de Comparator.

En el código siguiente, no cumple ninguna de las condiciones anteriores. Ni su clase Person implementa Comparable, ni está pasando ninguna instancia de Comparator.

ArrayList<Person> nameFromText = new ArrayList<Person>(); 
fillArrayList(nameFromText, pullFile); 
// Sort ArrayList 
Collections.sort(nameFromText); // How to sort? 

Debe crear un Comparator para su clase Person para contar el método sort() cómo solucionarlo (puede ser de cadena almacenada en la clase Persona)

de cómo se implementa un comparador genérico aquí:

public class PersonNameComparator implements Comparator<Person> { 
    public int compare(Person p1, Person p2) { 
     return p1.getName().compareTo(p2.getName()); 
    } 
} 

Y entonces su Collections.sort() invocación de método debe ser como: -

Collections.sort(nameFromText, new PersonNameComparator()); 
+1

@DavidTunnell Eres bienvenido .. También puedes google - "Diferencia entre comparador y comparable' para obtener más información ..' Comparable' también se usa para este propósito .. Pero 'Comparador' es más amplio, ya que puedes crear múltiples lógicas de clasificación ... –

+0

Lo haré gracias –

+0

Creo que tienes un error tipográfico en tu código. No debería ser: '... (Person) o' ** 1 **' ; ... Persona p2 = (Persona) o' ** 2 ** ';'? –

3

Alternativamente, puede implementar la interfaz Comparable directamente en la clase Person y anular el método 'compareTo (Object obj)'. En este caso, no necesitaría crear una nueva clase para el comparador. Y esto se comporta como una clasificación incorporada.

+1

+1 Eso es un punto válido ... Pero debería preferir 'Comparador' sobre' Comparable'. De esta forma puede tener múltiples lógicas de clasificación para su clase .. –

+0

Sí, como comparador le da la flexibilidad cuando hay más de un candidato de clasificación. –

2

Prueba esto:

List<String> inputString = Arrays.asList("Sijan", "Sudeep", "Parasar", "Raj Kumar"); 
Collections.sort(inputString); 
System.out.println(inputString); 
0

uso Collections.sort (managerNameList);

ArrayList<String> managerNameList = new ArrayList<String>(); 

    managerNameList.add("antesh"); 
    managerNameList.add("Lalit"); 
    managerNameList.add("Gokul"); 
    managerNameList.add("Ajay"); 

    System.out.println("Arraylist before sorting");  
    for(String name: managerNameList) 
    {  
     System.out.println(name);   
    } 

    Collections.sort(managerNameList); 

    System.out.println("Arraylist after sorting");  
    for(String name: managerNameList) 
    {  
     System.out.println(name);   
    }