web-dev-qa-db-fra.com

Tri d'une liste de tableaux de personnes avec des collections Java

Ci-dessous, le code que j'utilise fonctionne parfaitement et affiche les noms, sauf que la méthode de tri ne fonctionne pas. Je m'attendais à "Collections.sort (nameFromText);" trier ArrayList par ordre alphabétique par prénom.

Qu'est-ce que je fais 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();
}
8
David Tunnell

Collections.sort(List<T>) method s'attend à ce que l'élément de la liste qu'il trie soit comparable. Soit le type d'élément T doit implémenter l'interface Comparable , soit vous devez utiliser la méthode surchargée sort() , qui prend un générique Comparator instance. 

Dans le code ci-dessous, vous ne remplissez aucune des conditions ci-dessus. Ni votre classe Person implémente Comparable, ni vous ne passez aucune instance Comparator.

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

Vous devez créer une variable Comparator pour votre classe Person afin d'indiquer à la méthode sort() comment la trier (il peut s'agir d'une chaîne stockée dans la classe Person).

Voici comment vous implémentez un comparateur générique:

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

Et alors votre invocation de méthode Collections.sort() devrait ressembler à: -

Collections.sort(nameFromText, new PersonNameComparator());
28
Rohit Jain

Sinon, vous pouvez implémenter l'interface Comparable directement dans la classe Person et remplacer la méthode 'compareTo (Object obj)'. Dans ce cas, vous n’auriez pas besoin de créer une nouvelle classe pour le comparateur. Et cela se comporte comme un tri intégré.

4
Satheesh Cheveri

Essaye ça:

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

Si vous utilisez Java 8, utilisez un seul liner Expression Lambda

ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
nameFromText.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));
0
Divyesh Kanzariya

utilise 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);           
    }
0
Antesh Sharma