簡體   English   中英

如何對對象的Arraylist進行排序

[英]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());

我想看看:

  1. 切爾西
  2. 兵工廠
  3. 巴塞羅那

但它沒有排序。

來源: 這里

您可以將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進行排序時,可以輕松定義一個。

由於JAVA 8使用lamda

    // 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM