[英]Java, how to use compareTo to sort an Arraylist
我試圖弄清楚如何使用可比較的方式對ArrayList進行排序,我的代碼如下所示:
public class playerComparsion{
public static void main(String[] args){
ArrayList<Object> list = new ArrayList<Object>();
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>
類,您可以獲得更大的靈活性,而不是讓Player
實現Comparable
。 例如:
class PlayerComparatorByRating implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
return o1.getRating() - o2.getRating();
}
}
class PlayerComparatorByName implements Comparator<Player> {
@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);
你的班級似乎被命名為Players
。 最好重命名為Player
。
getName
, getRating
, getPos
方法不應返回void
並打印結果,而是返回字段值。
為構造函數參數使用更好的名稱,例如:
Player(int position, int rating, String name) {
this.position = position;
this.rating = rating;
this.name = name;
}
使用正確類型的列表來存儲玩家:
List<Player> list = new ArrayList<Player>();
請正確格式化您的代碼。 任何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<Player> {
@Override
public int compare(Player o1, Player o2) {
return o1.getRating() - o2.getRating();
}
}
class PlayerComparatorByName implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
return o1.getName().compareTo(o2.getName());
}
}
public class PlayerComparatorDemo {
public static void main(String[] args){
List<Player> list = new ArrayList<Player>();
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<Players>
。 這樣,您可以直接訪問您關注的對象,而無需從Object
。
樣本compareTo
將是這樣的:
public int compareTo(Player other) {
return rating - other.getRating();
}
然后,您實際上必須使用Collections.sort()
對其進行排序。
Collections.sort(list);
Comparable<Players>
的原因是Comparable
本身被定義為采用泛型類型T
嘗試這個。
public class Comparator_Test {
public static void main(String[] args) {
ArrayList<Players> list = new ArrayList<Players>();
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<Players> {
@Override
public int compare(Players o1, Players o2) {
if(o1.rating > o2.rating) {
return 1;
}
if(o1.rating < o2.rating) {
return -1;
}
return 0;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.