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

后端 未结 4 1544
花落未央
花落未央 2021-01-03 00:12

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 la

相关标签:
4条回答
  • 2021-01-03 00:40

    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())
                }
    
    0 讨论(0)
  • 2021-01-03 00:43
        //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 讨论(0)
  • 2021-01-03 00:54

    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())
           }
       });
    }
    
    0 讨论(0)
  • 2021-01-03 00:59

    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());
    }
    
    0 讨论(0)
提交回复
热议问题