在Java中按姓氏和名对对象的ArrayList进行排序

在Java中按姓氏和名对对象的ArrayList进行排序,java,Java,我有一个基于体育的不同类型球员的列表。首先,我需要按姓氏对arrayList中的玩家列表进行排序。如果两名玩家的姓氏相同,则需要按名字对这两名玩家进行排序。 示例:格式化Lastname firstname 威廉姆斯·罗伯特 菲利普斯·沃伦 多伊·约翰 菲利普斯马克 输出应该是 多伊·约翰 菲利普斯马克 菲利普斯·沃伦 威廉姆斯·罗伯特 我现在所拥有的只是按照代码中的第一台或最后一台atm进行排序 public static void sortPlayers(ArrayList playe

我有一个基于体育的不同类型球员的列表。首先,我需要按姓氏对arrayList中的玩家列表进行排序。如果两名玩家的姓氏相同,则需要按名字对这两名玩家进行排序。 示例:格式化Lastname firstname 威廉姆斯·罗伯特 菲利普斯·沃伦 多伊·约翰 菲利普斯马克

输出应该是 多伊·约翰 菲利普斯马克 菲利普斯·沃伦 威廉姆斯·罗伯特

我现在所拥有的只是按照代码中的第一台或最后一台atm进行排序

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

    }
}
publicstaticvoidsortplayers(arraylistplayerlist){
对于(int i=0;i
将比较器更改为:

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

佩塔的回答是正确的,只有两点:

  • 使用
    List
    而不是
    ArrayList
    作为方法参数,因为该接口更通用,即使您稍后更改为另一个
    List
    类型(如
    LinkedList
    …),该方法也会工作
  • 使用泛型使代码更加类型安全
改进版:

//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())
       }
   });
}
//定义列表的位置
List playerList=new ArrayList();
公共静态无效排序层(列表播放列表){
Collections.sort(playerList,newcomparator(){
公共整数比较(PlayerStats p1,PlayerStats p2){
int res=p1.getPlayerLastName().compareToIgnoreCase(p2.getPlayerLastName());
如果(res!=0)
返回res;
返回p1.getPlayerFirstName().compareToIgnoreCase(p2.getPlayerFirstName())
}
});
}

使用java8有一种简单的方法:

public List<PlayerStats> getSortedPlayerList(List<PlayerStats> playerList) {
    return playerList.stream().sorted(Comparator.comparing(PlayerStats::getPlayerLastName).thenComparing(PlayerStats::getPlayerFirstName)).collect(Collectors.toList());
}
public List getSortedPlayerList(List playerList){
返回playerList.stream().sorted(Comparator.comparing(PlayerStats::getPlayerLastName)。然后返回comparing(PlayerStats::getPlayerFirstName)).collect(collector.toList());
}
//需要java@8
//类Person{String fName;String lName;int id}
列表=新的ArrayList();
人员p1=新人员();
p1.设定名称(“a”);
p1.设定名称(“x”);
列表。添加(p1);
人员p4=新人员();
p4.设定名称(“b”);
p4.设定名称(“z”);
列表。添加(p4);
人员p3=新人员();
p3.设定名称(“a”);
p3.设定名称(“z”);
列表。添加(p3);
人员p2=新人员();
p2.设定名称(“a”);
p2.设定名称(“y”);
列表。添加(p2);
//按单个字段排序
Collections.sort(list,(o1,o2)->o1.getfName().compareTo(o2.getfName());
//按多个级联比较器排序。
Collections.sort(list,Comparator.comparing(Person::getfName)。然后比较(Person::getlName));
list.forEach(System.out::println);
//输出
//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]

另外,要去掉嵌套循环。Collections.sort为您完成所有工作
    //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]