如何排序对象的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; } } //... } 

主类:

  List lteams = new ArrayList; 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). 

我做了比较器。

  public class MyComparator implements Comparator { @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; } } 

现在我想用它(在主类)

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

我想看看:

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

但它没有排序。

来源: 这里

您可以将Collections.sort与自定义Comparator

  class Team { public final int points; // ... }; List players = // ... Collections.sort(players, new Comparator() { @Override public int compare(Team p1, Team p2) { return p1.points- p2.points; } }); 

或者,您可以使Team implements Comparable 。 这定义所有Team对象自然顺序。 使用Comparator器更灵活,因为不同的实现可以按名称,年龄等顺序排序。

也可以看看

  • Java:实现ComparableComparator什么区别?

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

也可以看看

  • Java Integer:什么是更快的比较或减法?
 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 lteams = new ArrayList(); 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"); } } 

}

 class MyComparator implements Comparator { @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; }} 

输出:
切尔西:3分
阿森纳足球俱乐部:2分
FC Barcelona:0分

实际上并不需要像这样定义自定义Comparator。

相反,当您想要对ArrayList进行排序时,可以轻松定义一个。

由于JAVA 8使用lamda

  // Sort version. Iteams.sort(Comparator.comparing(Team::getPoints)); // Complete version. Iteams.sort((o1, o2) -> o1.getPoints().compareTo(o2.getPoints())); 

还有第二个比较器的选项,如果对象在第一个上等于:

  // eg if same points, then compare their names. Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName)); 

另请注意,默认排序选项是升序 ,但您可以使用以下命令将其设置为降序

  // eg Sort by points descending. Iteams.sort(Comparator.comparing(Team::getPoints).reversed()); 

这样,您可以随时以不同的方式对ArrayList进行排序,只需添加所需的方法即可。

使用此链接,您将找到答案