如何对对象的Arraylist进行排序

n0h*_*epe 14 java collections arraylist

我有ArrayList,其中包含足球队(Team Team).团队有积分,我想按点数对它们进行排序.

 public class Team {
     private int points;
     private String name;

     public Team(String n)
     {
         name = n;
     }

     public int getPoints
     {
         return points;
     }

     public void addPoints(boolean win)
 {
            if (win==true)
            {
    points = points + 3;
            }

            else if (win==false)
            {
            points = points + 1;
            }

}
 //...
 }
Run Code Online (Sandbox Code Playgroud)

主类:

 List<Team> lteams = new ArrayList<Team>;

 lteams.add(new Team("FC Barcelona"));
 lteams.add(new Team("Arsenal FC"));
 lteams.add(new Team("Chelsea"));

 //then adding 3 points to Chelsea and 1 point to Arsenal

 lteams.get(2).addPoints(true);
 lteams.get(1).addPoints(false);

 //And want sort teams by points (first index with most points). 
Run Code Online (Sandbox Code Playgroud)

我做了比较器.

 public class MyComparator implements Comparator<Team> {


    @Override
    public int compare(Team o1, Team o2) {
        if (o1.getPoints() > o2.getPoints())
         {
             return 1;
         }
        else if (o1.getPoints() < o2.getPoints())
        {
            return -1;
        }
        return 0;    
    } 

}
Run Code Online (Sandbox Code Playgroud)

现在我想用它(在主类)

 Colections.sort(lteams, new MyComparator());
Run Code Online (Sandbox Code Playgroud)

我想看看:

  1. 切尔西
  2. 兵工厂
  3. 巴塞罗那

但它没有排序.

PaR*_*RaJ 30

来源:这里

您可以使用Collections.sort自定义Comparator<Team>.

    class Team {
        public final int points;
        // ...
    };

    List<Team> players = // ...

    Collections.sort(players, new Comparator<Team>() {
        @Override public int compare(Team p1, Team p2) {
            return p1.points- p2.points;
        }

    });
Run Code Online (Sandbox Code Playgroud)

或者,你可以做Team implementsComparable<Team>.这定义所有Team对象自然顺序.使用a Comparator更灵活,因为不同的实现可以按名称,年龄等顺序排序.

也可以看看


为了完整起见,我应该注意,return o1.f - o2.f由于可能的溢出,必须非常谨慎地使用逐个减法的快捷方式(阅读:Effective Java 2nd Edition:Item 12:考虑实现Comparable).据推测,曲棍球并不是一项运动,其中球员可以在引起问题的数量上进球... =)

也可以看看

  • 这基本上就是OP的作用!?除了他没有创建一个匿名类 (4认同)

Dmi*_*ril 13

public class Team {
   private int points;
   private String name;

public Team(String n, int p) {
    name = n;
    points = p;
}

public int getPoints() {
    return points;
}

public String getName() {
    return name;
}

public static void main(String[] args) {
    List<Team> lteams = new ArrayList<Team>();

    lteams.add(new Team("FC Barcelona", 0));
    lteams.add(new Team("Arsenal FC", 2));
    lteams.add(new Team("Chelsea", 3));

    Collections.sort(lteams, new MyComparator());

    for (Team lteam : lteams) {
        System.out.println(lteam.name + ": " + lteam.points + " points");
    }
}
Run Code Online (Sandbox Code Playgroud)

}

class MyComparator implements Comparator<Team> {
@Override
public int compare(Team o1, Team o2) {
    if (o1.getPoints() > o2.getPoints()) {
        return -1;
    } else if (o1.getPoints() < o2.getPoints()) {
        return 1;
    }
    return 0;
}}
Run Code Online (Sandbox Code Playgroud)

输出:
切尔西:3分
阿森纳足球俱乐部:
巴塞罗那队2分:0分