ArrayList中的Java排序对象

嗨,我有Card类…在另一个类中,我创建了一个Card对象的arrayList。 我如何根据卡的值对arrayList进行排序? ace是最低的卡值,国王是最高的。

A,2,3,4,5,6,7,8,9,T,J,Q,K

public class Card { char rank, suit; public Card(char rank, char suit){ this.rank = rank; this.suit = suit; } public void setCard(char rank, char suit){ this.rank = rank; this.suit = suit; } public char getRank(){ return rank; } public char getSuit(){ return suit; } public void setRank(char rank){ this.rank = rank; } public void setSuit(char suit){ this.suit = suit; } public String toString(){ String str = ""; str += this.getRank(); str += this.getSuit(); return str; } public boolean equals(Object obj){ Card card = (Card) obj; if(this.rank == card.getRank() && this.suit == card.getSuit()){ return true; } return false; } public boolean isValidCard(Card card){ char s = card.getSuit(); char r = card.getRank(); if(s=='H' || s=='S' || s=='D' || s=='C'){ if(r=='A' || r=='2' || r=='3' || r=='4' || r=='5' || r=='6' || r=='7' || r=='8' || r=='9' || r=='T' || r=='J' || r=='Q' || r=='K'){ return true; } } return false; } public boolean allowedInHigherPiles(Card card, Game game, int pile){ if(pile>=5 && game.getPile(pile).cards.size()==0){ if(card.getRank()!='K') return false; } return true; } } 

一种选择是实现Comparable接口,然后覆盖compareTo一旦完成,使用Collections.sort(myCollection)可以轻松地对列表进行排序;

您最好避免实现Comparable并创建Comparator对象,并且有一个Collections.sort版本可以使用比较器。

您的比较function可以简单地检查卡的等级,并在忽略该套装时返回结果。

您可能希望阅读所有这些订购业务的Java教程。

更新:Bjorn正确指出当类具有自然排序顺序时应使用Comparable。 我个人的观点是,对于卡片而言,实际上没有“自然顺序”,因为不同的游戏对Ace的解释不同,所以最好通过提供Comparable作为课程的一部分来避免分配“语义”。

如果使用enum来表示排名和套件而不是char,则代码会更加清晰。

实际上, http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html有一个Card示例说明了Enum的使用

相关代码位复制如下

 public class Card implements Comparable, java.io.Serializable { public enum Rank { deuce, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace } public enum Suit { clubs, diamonds, hearts, spades } private final Rank rank; private final Suit suit; private Card(Rank rank, Suit suit) { if (rank == null || suit == null) throw new NullPointerException(rank + ", " + suit); this.rank = rank; this.suit = suit; } public Rank rank() { return rank; } public Suit suit() { return suit; } public String toString() { return rank + " of " + suit; } public int compareTo(Object o) { Card c = (Card)o; int rankCompare = rank.compareTo(c.rank); return rankCompare != 0 ? rankCompare : suit.compareTo(c.suit); } private static List sortedDeck = new ArrayList(52); static { for (Iterator i = Rank.VALUES.iterator(); i.hasNext(); ) { Rank rank = i.next(); for (Iterator j = Suit.VALUES.iterator(); j.hasNext(); ) sortedDeck.add(new Card(rank, j.next())); } } // Returns a shuffled deck public static List newDeck() { List result = new ArrayList(sortedDeck); Collections.shuffle(result); return result; } } 

缺少CompareTo代码:

 ArrayList aCardList = new ArrayList(); Collections.sort(aCardList, new Comparator() { @Override public int compare(Card o1, Card o2) { if (o1.getRank() > o2.getRank()) return -1; else if (o1.getRank() < o2.getRank()) return 1; else return 0; } }); 

您可以实现Comparable接口,以便按等级比较元素。 然后Collections.sort将自动执行您期望的操作。

一些较短的方法

 public String toString() { return "" + rank + suit; } public boolean isValidCard(){ return "HSDC".indexOf(suit) != -1 && "A23456789TJQK".indexOf(rand) != -1; } 

您可以使用java.util.Collections类对其进行排序。 特别是,两种方法可能会派上用场:

  static > void sort(List list) Sorts the specified list into ascending order, according to the natural ordering of its elements. static  void sort(List list, Comparator c) Sorts the specified list according to the order induced by the specified comparator. 

对于第一种方法,您应该使您的Card类实现Comparable接口。对于第二种方法,您应该提供自定义比较器。

这样做是为了让集合框架知道如何比较您的Card对象。

所以,例如(第一种方法),您将拥有以下代码:

在你的卡类

 public Class Card implements Comparable{ //member and method definitions. public int compareTo(Object o){ //null checks && stuff missing. /*compares two cards based on rank.*/ } List cards = getAllCards();//returns an unsorted list implementation of Card objects. java.util.Collections.sort(cards); 
 public class ClassName implements Comparable { // Variables -------------------------------------------- private double comparedVariable; // Constructor ------------------------------------------ public ClassName (){} // Functions -------------------------------------------- //returns the fuel weight public double getComparedVariable() { return comparedVariable; } // Overrides -------------------------------------------- @Override public int compareTo(Object o) { ClassName classObject = (ClassName) o; if (this.comparedVariable> classObject.getComparedVariable()) return 1; //make -1 to sort in decreasing order else if (this.comparedVariable< classObject.getComparedVariable()) return -1;//make 1 to sort in decreasing order else return 0; } } 
 public class player {   String Fname = "";  String Lname = "";  ArrayList cards= new ArrayList ();  public String getFname() {    return Fname;  }  public void setFname(String Fname) {    this.Fname = Fname;  }  public String getLname() {    return Lname;  }  public void setLastname(String Lname) {    this.Lname = Lname;  }  public ArrayList getCards() {    return cards;  }  public void setCards(ArrayList cards) {    this.cards = cards;  }  public player(String fname,String lname) {    this.Fname = fname;    this.Lname = lname;  }    public void AddCard(Card card){    cards.add(card);  }    public void showCards(){    System.out.println(""+Fname+" "+Lname+" holds the following cards");    for (int i=0;i