[英]How to sort Arraylist of objects
我有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<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).
我做了比較器。
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;
}
}
現在我想用它(在主類)
Colections.sort(lteams, new MyComparator());
我想看看:
但它沒有排序。
來源: 這里
您可以將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;
}
});
或者,您可以使Team implements
Comparable<Team>
。 這定義了所有Team
對象的自然順序。 使用Comparator
器更靈活,因為不同的實現可以按名稱,年齡等進行排序。
為了完整return o1.f - o2.f
,我應該注意,由於可能的溢出,必須非常謹慎地使用return o1.f - o2.f
減法的快捷方式(閱讀: Effective Java 2nd Edition:Item 12:考慮實現Comparable
)。 據推測,曲棍球並不是一項運動,其中球員可以在引起問題的數量上進球... =)
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");
}
}
}
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;
}}
輸出:
切爾西:3分
阿森納足球俱樂部:2分
FC Barcelona:0分
實際上並不需要像這樣定義自定義Comparator。
相反,當您想要對ArrayList進行排序時,可以輕松定義一個。
// Sort version.
Iteams.sort(Comparator.comparing(Team::getPoints));
// Complete version.
Iteams.sort((o1, o2) -> o1.getPoints().compareTo(o2.getPoints()));
還有第二個比較器的選項,如果對象在第一個上等於:
// e.g. if same points, then compare their names.
Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName));
另請注意,默認排序選項是升序 ,但您可以使用以下命令將其設置為降序 :
// e.g. Sort by points descending.
Iteams.sort(Comparator.comparing(Team::getPoints).reversed());
這樣,您可以隨時以不同的方式對ArrayList進行排序,只需添加所需的方法即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.