ArrayList中的Java排序对象

use*_*514 5 java collections

嗨,我有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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Jou*_*mer 10

如果使用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<Card> sortedDeck = new ArrayList<Card>(52);
    static {
        for (Iterator<Rank> i = Rank.VALUES.iterator(); i.hasNext(); ) {
            Rank rank = i.next();
            for (Iterator<Suit> j = Suit.VALUES.iterator(); j.hasNext(); )
                sortedDeck.add(new Card(rank, j.next()));
        }
    }

    // Returns a shuffled deck
    public static List<Card> newDeck() {
        List<Card> result = new ArrayList<Card>(sortedDeck);
        Collections.shuffle(result);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)


Uri*_*Uri 9

一个选项是实现Comparable接口,然后覆盖compareTo一旦完成,使用Collections.sort(myCollection)对列表进行排序很容易;

您可能更好地避免实现Comparable并创建Comparator对象,并且有一个版本的Collections.sort采用比较器.

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

您可能想要阅读所有这些订购业务的Java教程.

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