开发者

Sort an ArrayList of Objects by last name, then first name

开发者 https://www.devze.com 2023-03-20 23:42 出处:网络
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 t

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;
  开发者_StackOverflow中文版                  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]
0

精彩评论

暂无评论...
验证码 换一张
取 消