2012-10-07 8 views
7

Di seguito il codice che sto utilizzando funziona correttamente e restituisce i nomi tranne che il metodo di ordinamento non funziona. Mi aspettavo "Collections.sort (nameFromText);" per ordinare la lista array in ordine alfabetico per nome.Ordinamento di una lista array di persone con raccolte java

Cosa sto sbagliando?

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

Troverete questo utile. http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/ e http://www.thejavageek.com/2013/06/17/sorting-user-defined -objects-part-2/ –

risposta

26

Collections.sort(List<T>) metodo prevede l'elemento della lista viene ordinamento essere comparabili. Il tipo di elemento T deve implementare l'interfaccia Comparable oppure è necessario utilizzare il metodo sovraccarico sort() che accetta un'istanza generica Comparator.

Nel seguente codice, non si soddisfa nessuna delle precedenti condizioni. Né la tua classe Person implementa Comparable né si passa alcuna istanza Comparator.

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

È necessario creare un Comparator per la classe Person a dire il metodo di sort() come ordinare esso (può essere su stringa memorizzata in classe Person)

Ecco come si implementa un confronto generico:

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

E poi il tuo metodo di Collections.sort() invocazione dovrebbe essere come: -

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

@DavidTunnell Siete i benvenuti .. Puoi anche google - "Differenza tra comparatore e comparabile" per ottenere maggiori informazioni .. "Comparable" è anche usato per questo scopo .. Ma "Comparator' è più ampia, come è possibile creare più logiche di ordinamento .. –

+0

Lo farò grazie –

+0

Penso che hai un errore di battitura sul tuo codice. Non dovrebbe essere: '... (Persona) o' ** 1 **' ; ... Person p2 = (Person) o' ** 2 ** ';'? –

3

In alternativa è possibile implementare l'interfaccia Comparable direttamente nella classe Person e sovrascrivere il metodo 'compareTo (Object obj)'. In questo caso non è necessario creare una nuova classe per il comparatore. E questo si comporta come un ordinamento integrato.

+1

+1 Questo è un punto valido .. Ma dovresti preferire 'Comparator' a' Comparable'. In questo modo puoi avere più logiche di ordinamento per la tua classe .. –

+0

Sì, come comparatore ti dà la flessibilità quando ci sono più candidati di classificazione. –

2

Prova questo:

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);   
    } 
Problemi correlati