如何排序对象的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());
我想看看:
- 切尔西
- 兵工厂
- 巴塞罗那
但它没有排序。
来源: 这里
您可以将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:实现
Comparable
和Comparator
什么区别?
为了完整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进行排序,只需添加所需的方法即可。
使用此链接,您将找到答案