David Tunnell
David Tunnell

Reputation: 7542

Sorting an ArrayList of Person with java collections

Below the code I am using works just fine and outputs the names except that the sort method is not working. I expected "Collections.sort(nameFromText);" to sort the ArrayList in alphabetical order by first name.

What am I doing wrong?

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();
}

Upvotes: 8

Views: 55418

Answers (5)

Divyesh Kanzariya
Divyesh Kanzariya

Reputation: 3789

If you using Java 8 then use one liner Lambda Expression

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

Upvotes: 1

Rohit Jain
Rohit Jain

Reputation: 213351

Collections.sort(List<T>) method expects the element of the list it is sorting to be comparable. Either the element type T should implement the Comparable interface, or you should use the overloaded sort() method, that takes a generic Comparator instance.

In the code below, you are satisfying neither of the above conditions. Neither your Person class implements Comparable, nor you are passing any Comparator instance.

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

You should create a Comparator for your Person class to tell the sort() method how to sort it (may be on String stored in Person class)

Here's how you implement a generic comparator:

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

And then your Collections.sort() method invocation should be like: -

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

Upvotes: 28

Antesh Sharma
Antesh Sharma

Reputation: 309

use 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);           
    }

Upvotes: 0

MudvariSijan
MudvariSijan

Reputation: 31

Try this:

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

Upvotes: 2

Satheesh Cheveri
Satheesh Cheveri

Reputation: 3679

Alternatively you can implement Comparable interface directly in Person class and override 'compareTo(Object obj) ' method. In this case you would not need to create new class for comparator. And this behaves like inbuilt sorting.

Upvotes: 4

Related Questions