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();
}
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());
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é.
Essaye ça:
List<String> inputString = Arrays.asList("Sijan", "Sudeep", "Parasar", "Raj Kumar");
Collections.sort(inputString);
System.out.println(inputString);
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()));
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);
}