简体   繁体   中英

Sorting an ArrayList of Objects by Last name and firstname in Java

I have an arrayList of different types of players based on sports. I need to sort the list of players in the arrayList by last name to start. If 2 players have the same last name it needs to then sort those 2 players by the first name. example: Format Lastname firstname Williams Robert Phillips Warren Doe John Phillips Mark

Output should be Doe John Phillips Mark Phillips Warren Williams Robert

What i have now only sorts by either the first or last i have it by last atm in my code.

   public static void sortPlayers(ArrayList playerList) {
    for (int i = 0; i < playerList.size(); i++) {
        for (int j = 0; j < playerList.size(); j++) {
            Collections.sort(playerList, new Comparator() {

                public int compare(Object o1, Object o2) {
                    PlayerStats p1 = (PlayerStats) o1;
                    PlayerStats p2 = (PlayerStats) o2;
                    return p1.getPlayerLastName().compareToIgnoreCase(p2.getPlayerLastName());
                }
            });
        }

    }
}

Change the comparator to:

            public int compare(Object o1, Object o2) {
                PlayerStats p1 = (PlayerStats) o1;
                PlayerStats p2 = (PlayerStats) o2;
                int res =  p1.getPlayerLastName().compareToIgnoreCase(p2.getPlayerLastName());
                if (res != 0)
                    return res;
                return p1.getPlayerFirstName().compareToIgnoreCase(p2.getPlayerFirstName())
            }

Petar's answer is correct, just two remarks:

  • Use List instead of ArrayList as method argument, as the interface is more general, and the method will work even if you change to another List type (like LinkedList ... ) later
  • Use generics to make your code more type safe.

An improved version:

//the place where you define the List
List<PlayerStats> playerList = new ArrayList<PlayerStats>();


public static void sortPlayers(List<PlayerStats> playerList) {
   Collections.sort(playerList, new Comparator<PlayerStats>() {
       public int compare(PlayerStats p1, PlayerStats p2) {
            int res =  p1.getPlayerLastName().compareToIgnoreCase(p2.getPlayerLastName());
            if (res != 0)
                return res;
            return p1.getPlayerFirstName().compareToIgnoreCase(p2.getPlayerFirstName())
       }
   });
}

Using java8 there is easy way to do this:

public List<PlayerStats> getSortedPlayerList(List<PlayerStats> playerList) {
    return playerList.stream().sorted(Comparator.comparing(PlayerStats::getPlayerLastName).thenComparing(PlayerStats::getPlayerFirstName)).collect(Collectors.toList());
}
    //requires java@8
    //class Person { String fName; String lName; int id}

    List<Person> list = new ArrayList<>();
    Person p1 = new Person();
    p1.setfName("a");
    p1.setlName("x");
    list.add(p1 );

    Person p4 = new Person();
    p4.setfName("b");
    p4.setlName("z");
    list.add(p4);

    Person p3 = new Person();
    p3.setfName("a");
    p3.setlName("z");
    list.add(p3);

    Person p2 = new Person();
    p2.setfName("a");
    p2.setlName("y");
    list.add(p2);

    //sort by a single field
    Collections.sort(list, (o1,o2) ->  o1.getfName().compareTo(o2.getfName()));

    //sort by multiple cascading comparator.
    Collections.sort(list, Comparator.comparing(Person::getfName).thenComparing(Person::getlName));
    list.forEach( System.out::println);

    //output
    //Person [fName=a, lName=x, id=null]
    //Person [fName=a, lName=y, id=null]
    //Person [fName=a, lName=z, id=null]
    //Person [fName=b, lName=z, id=null]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM