Java,如何使用compareTo对Arraylist进行排序

我试图弄清楚如何使用可比较的方式对ArrayList进行排序,我的代码如下所示:

public class playerComparsion{ public static void main(String[] args){ ArrayList list = new ArrayList(); Player p1 = new Players(1,92,Zlatan); Player p2 = new Players(2,92,Hazard); Player p3 = new Players(1,82,Klose); list.add(p1); list.add(p2); list.add(p3); } } class Players implements Comparable{ int position; String name; int rating; public Players(int i, int j, String string) { this.position=i; this.rating=j; this.name=string; } public void getRating() { System.out.println(this.rating); } public void getPos() { System.out.println(this.position); } public void getName() { System.out.println(this.name); } @Override public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } } 

我想根据属性评级对Arraylist进行排序。 我想我应该使用compareTo函数,但我不知道怎么会有人帮助我?

通过实现Comparator类,您可以获得更大的灵活性,而不是让Player实现Comparable 。 例如:

 class PlayerComparatorByRating implements Comparator { @Override public int compare(Player o1, Player o2) { return o1.getRating() - o2.getRating(); } } class PlayerComparatorByName implements Comparator { @Override public int compare(Player o1, Player o2) { return o1.getName().compareTo(o2.getName()); } } 

毕竟, Player有多个领域,很容易想象有时你可能想要以不同的方式订购玩家。 这种方法的一大优点是单一责任原则Player类只做一件事,封装了玩家数据。 不要再增加一个责任(排序),最好将该逻辑移到另一个类中。

您可以将这些比较器与Collections.sort ,例如:

 Collections.sort(list, new PlayerComparatorByRating()); System.out.println(list); Collections.sort(list, new PlayerComparatorByName()); System.out.println(list); 

额外提示

你的class级似乎被命名为Players 。 最好重命名为Player

getNamegetRatinggetPos方法不应返回void并打印结果,而是返回字段值。

为构造函数参数使用更好的名称,例如:

 Player(int position, int rating, String name) { this.position = position; this.rating = rating; this.name = name; } 

使用正确类型的列表来存储玩家:

 List list = new ArrayList(); 

请正确格式化您的代码。 任何IDE都可以做到这一点。

建议实施

 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class Player { private int position; private int rating; private final String name; Player(int position, int rating, String name) { this.position = position; this.rating = rating; this.name = name; } public int getRating() { return rating; } public int getPos() { return position; } public String getName() { return name; } @Override public String toString() { return String.format("%s:%d:%d", name, position, rating); } } class PlayerComparatorByRating implements Comparator { @Override public int compare(Player o1, Player o2) { return o1.getRating() - o2.getRating(); } } class PlayerComparatorByName implements Comparator { @Override public int compare(Player o1, Player o2) { return o1.getName().compareTo(o2.getName()); } } public class PlayerComparatorDemo { public static void main(String[] args){ List list = new ArrayList(); Player p1 = new Player(1, 92, "Zlatan"); Player p2 = new Player(2, 92, "Hazard"); Player p3 = new Player(1, 82, "Klose"); list.add(p1); list.add(p2); list.add(p3); Collections.sort(list, new PlayerComparatorByRating()); System.out.println(list); Collections.sort(list, new PlayerComparatorByName()); System.out.println(list); } } 

不要将原始类型与Comparable 。 相反,请使用Comparable 。 这样,您可以直接访问您关心的对象,而无需从Object

样本compareTo将是这样的:

 public int compareTo(Player other) { return rating - other.getRating(); } 

然后,您实际上必须使用Collections.sort()对其进行排序。

 Collections.sort(list); 

Comparable的原因是Comparable本身被定义为采用generics类型T

尝试这个。

 public class Comparator_Test { public static void main(String[] args) { ArrayList list = new ArrayList(); Players p1 = new Players(1,92,"Zlatan"); Players p2 = new Players(2,92,"Hazard"); Players p3 = new Players(1,82,"Klose"); list.add(p1); list.add(p2); list.add(p3); PlayerComparator comparator = new PlayerComparator(); System.out.println(list); Collections.sort(list, comparator); System.out.println(list); } } class Players { int position; String name; int rating; public Players(int i, int j, String string) { this.position=i; this.rating=j; this.name=string; } public void getRating() { System.out.println(this.rating); } public void getPos() { System.out.println(this.position); } public void getName() { System.out.println(this.name); } public String toString() { return rating + ""; } } class PlayerComparator implements Comparator { @Override public int compare(Players o1, Players o2) { if(o1.rating > o2.rating) { return 1; } if(o1.rating < o2.rating) { return -1; } return 0; } }