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
。
getName
, getRating
, getPos
方法不应返回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; } }