2009-04-26 5 views
5

Witam Mam kartę Card ... W innej klasie tworzę tablicęList obiektów Card. Jak chciałbym posortować listę arrayList na podstawie wartości karty? As jest najniższą wartością karty, a król jest najwyższy.Java Sortowanie obiektu w ArrayList

A, 2,3,4,5,6,7,8,9, t, J, P, 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; 
    } 

} 

Odpowiedz

9

Jedną z możliwości jest wprowadzenie porównywalnym interfejs i następnie zastąpić compareTo Kiedy zrobiłeś to, sortowanie listy jest łatwe dzięki Collections.sort (myCollection);

Możesz lepiej unikać implementacji porównywalnych i utworzyć obiekt Comparator, a istnieje wersja Collections.sort, która pobiera komparator.

Funkcja porównania może wtedy po prostu sprawdzić rangę kart i zwrócić wynik, ignorując kombinezon.

Możesz przeczytać samouczek Java na temat all this ordering business.

Aktualizacja: Bjorn wskazuje poprawnie, że Porównywalne powinno być używane, gdy klasa ma naturalny porządek sortowania. Moim osobistym zdaniem jest to, że w przypadku kart nie istnieje tak naprawdę "porządek naturalny", ponieważ różne gry różnią się interpretacją asa, więc lepiej byłoby unikać przypisywania "semantyki", oferując porównywalne jako część klasy.

+1

Ponieważ talia kart ma naturalny porządek Polecam przy użyciu interfejs porównywalny nad osobnej klasy porównawczej. Klasy komparatorów powinny być używane, gdy obiekt nie ma naturalnej kolejności sortowania, takiej jak klasa Shoe. Różni ludzie sortują swoje buty na różne sposoby (według koloru, rozmiaru, ceny). :-) –

+0

Bjorn: Zgadzam się z tym wyjątkiem, że rola asa zmienia się w wielu grach (np. BJ i pokerze), więc byłbym ostrożny dodając semantykę do kart. – Uri

1

Możesz użyć klasy java.util.Collections, aby ją posortować. Szczególnie dwie metody mogą się przydać:

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. 

dla pierwszej metody, należy dokonać klasa Karta wdrożenia porównywalnym interfejs .. dla drugiego, należy podać własny komparator.

Dokonuje się tego, aby struktura kolekcji mogła wiedzieć, jak porównać obiekty karty.

Tak więc, na przykład (pierwsze metody), to masz ten kod:

W swojej klasie karty

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

Kod byłoby znacznie czystsze jeśli używasz enum do reprezentowania rangę i pakiet zamiast char.

W rzeczywistości http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html ma próbka Karta ilustruje użycie Enum

Odpowiedni bitowy kod jest skopiowany poniżej

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

Zamiast tego możesz wywołać One => Ace i Thirteen => King itd. ;) –

+0

Ostatnim standardem było użycie AOL-shouty-retard-case dla nazw instancji enum. Uczynienie karty niezmienną jest dobrym pomysłem. –

+0

Strona intro Java's Enum podaje również przykład karty http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html – Pool

1

Kilka krótkich metod

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

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

Brakujący kod 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; 
        } 
    } 
     
}