2009-04-26 131 views
5

嗨,我有Card類......在另一個類中,我創建了一個Card對象的數組列表。我將如何去基於卡的價值對arrayList進行排序?王牌是最低的牌值,國王是最高的。ArrayList ArrayList中的對象

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; 
    } 

} 

回答

9

一種選擇是實現Comparable接口,然後覆蓋的compareTo 一旦你已經做到了,用Collections.sort(myCollection)對列表進行排序很簡單;

您可能會更好地避免實現Comparable並創建一個Comparator對象,並且有一個採用比較器的Collections.sort版本。

你的比較函數可以簡單地檢查牌的等級,並返回結果,而忽略了西裝。

您可能想要閱讀關於all this ordering business的Java教程。

更新:Bjorn正確指出當類具有自然排序順序時應使用Comparable。我個人的觀點是,對於卡片來說,由於不同的遊戲對Ace的解釋不同,所以並不是真正的「自然順序」,所以最好避免通過將Comparable作爲課程的一部分來分配「語義」。

+1

由於一副牌具有自然排序順序,我建議使用Comparable接口通過單獨的Comparator類。當對象沒有自然的排序順序時,比如類的鞋類應該使用比較類。不同的人以不同的方式(按顏色,按尺寸,按價格)對鞋子進行分類。 :-) – 2009-04-26 20:32:46

+0

比約恩:除非王牌在許多遊戲中的角色發生變化(比如BJ和撲克),否則我會同意,所以我會小心地爲卡片添加語義。 – Uri 2009-04-26 20:55:45

1

您可以實現接口,使得元素按等級進行比較。然後Collections.sort將自動執行您期望的操作。

1

您可以使用java.util.Collections類對其進行排序。特別是,這兩種方法可能會派上用場:

static <T extends Comparable<? super T>> 
void sort(List<T> list) 
     Sorts the specified list into ascending order, according to the natural ordering of its elements. 

static <T> void sort(List<T> list, Comparator<? super T> c) 
     Sorts the specified list according to the order induced by the specified comparator. 

對於第一種方法,你應該讓你的卡類實現Comparable接口.. 對於第二個,你應該提供一個自定義的比較。

這樣做是爲了讓收藏框架知道如何比較您的卡片對象。

因此,舉例來說(第一種方法),你有這樣的代碼:

在你的卡類

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<Card> cards = getAllCards();//returns an unsorted list implementation of Card objects. 

java.util.Collections.sort(cards); 
10

如果您使用枚舉來表示秩和套房,而不是代碼將是更清潔的字符。

事實上,http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html具有卡樣品示出使用枚舉

的下面

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; 
    } 
} 
1

幾個短方法

public String toString() { 
    return "" + rank + suit; 
} 

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

失蹤的CompareTo代碼相關的代碼位被複制:

ArrayList<Card> aCardList = new ArrayList<Card>(); 

    Collections.sort(aCardList, new Comparator<Card>() { 

     @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; 
     } 
    }); 
1
public class ClassName implements Comparable<Object> { 

    // 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; 
    } 

} 
-1
public class player { 
     String Fname = ""; 
    String Lname = ""; 
    ArrayList<Card> cards= new ArrayList<Card>(); 
    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<Card> getCards() { 
        return cards; 
    } 

    public void setCards(ArrayList<Card> 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<cards.size();i++) 
        { 
            System.out.print(cards.get(i).toString()); 
        } 
        System.out.println(); 
    } 
     
    public void Sortcardsbyface() 
    { 
        for (int i = 0; i < cards.size() - 1; i++) 
        { 
            int j = i; 
            for (int k = i + 1; k < cards.size(); k++) 
            { 
                Card c = new Card(); 
                if (c.toInt(cards.get(k).getFace()) < c.toInt(cards.get(j).getFace())) 
                { 
                    j=k; 
                } 

            } 

            Card temp = cards.get(j); 
            cards.set(j,cards.get(i)); 
            cards.set(i,temp); 

        } 
        showCards(); 
    } 
} 


/* 
 * To change this license header, choose License Headers in Project Properties. 
 * To change this template file, choose Tools | Templates 
 * and open the template in the editor. 
 */ 
package pokegame; 

/** 
 * 
 * @author admin 
 */ 
public class Card { 
     private String face; 
    private char suit;  

    Card(char suit,String face) { 
        this.suit = suit; 
        this.face = face; 
    } 

    Card() { 
         
    } 

    public String getFace() { 
        return face; 
    } 

    public void setFace(String face) { 
        this.face = face; 
    } 

    public char getSuit() { 
        return suit; 
    } 

    public void setSuit(char suit) { 
        this.suit = suit; 
    } 
    
    public String toString(){ 
        return face+suit;   
    } 
   
     
    public int toInt(String face){ 
        switch(face){ 
            case "A": 
                return 1; 
            case "J": 
                return 11; 
            case "Q": 
                return 12; 
            case "K": 
                return 13; 
            case "2": 
                return 2; 
            case "3": 
                return 3; 
            case "4": 
                return 4;         
            case "5": 
                return 5;         
            case "6": 
                return 6; 
            case "7": 
                return 7;     
            case "8": 
                return 8;     
            case "9": 
                return 9;     
            case "10": 
                return 10;     
                 
                 
                 
                 
            default: 
                return 0; 
        } 
    } 
     
}