2009-04-26 21 views
5

Hola Tengo clase de tarjeta ... En otra clase, creo un arrayList de objetos de tarjeta. ¿Cómo haría para ordenar el arrayList basado en el valor de la tarjeta? El as es el valor más bajo de la carta y el rey es el más alto.Java Objeto de ordenación en 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; 
    } 

} 

Respuesta

9

Una opción es implementar la interfaz Comparable y luego anular compareTo Una vez ya lo ha hecho, clasificar la lista es fácil con Collections.sort (myCollection);

Puede que sea mejor evitar la implementación de Comparable y crear un objeto Comparator, y hay una versión de Collections.sort que toma el comparador.

Su función de comparación puede simplemente verificar el rango de las cartas y devolver el resultado ignorando el palo.

Es posible que desee leer el tutorial de Java en all this ordering business.

Actualización: Bjorn señala correctamente que Comparable se debe usar cuando la clase tiene un orden de clasificación natural. Mi opinión personal es que para las cartas no existe realmente un "orden natural" ya que los diferentes juegos difieren en su interpretación del As, así que sería mejor evitar asignar "semántica" al ofrecer Comparable como parte de la clase.

+1

Desde una baraja de cartas tiene un orden natural, yo recomendaría usar la interfaz Comparable más de una clase Comparador independiente. Las clases de comparación deben usarse cuando un objeto no tiene un orden natural, como una clase de calzado. Diferentes personas clasifican sus zapatos de diferentes maneras (por color, por tamaño, por precio). :-) –

+0

Bjorn: Estoy de acuerdo, excepto que el rol del as cambia en muchos juegos (por ejemplo, BJ y póker), así que tendría cuidado de agregar semántica a las cartas. – Uri

1

Puede usar la clase java.util.Collections para ordenarla. En particular, dos métodos pueden venir a mano:

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. 

Para el primer método, usted debe hacer su clase de la tarjeta de implementar la interfaz Comparable .. Para la segunda, se debe proporcionar un comparador personalizado.

Esto se hace para que el marco de colecciones sepa cómo comparar los objetos de su Tarjeta.

Así, por ejemplo (primer método), que tendría este código:

En su clase de tarjeta de

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

El código sería mucho más limpio si se utiliza enumeración para representar el rango y suite en vez de char

De hecho, http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html tiene una muestra Tarjeta ilustra el uso de Enum

El bit de código correspondiente se copia a continuación

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

Podrías llamar a One => Ace y Thirteen => King, etc. en su lugar. ;) –

+0

El estándar final era usar AOL-shouty-retard-case para nombres de instancia enum. Hacer tarjetas inmutables es una buena idea. –

+0

La página de introducción Enum de Java también proporciona un ejemplo de tarjeta http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html – Pool

1

Un par de métodos más cortos

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

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

El código CompareTo Missing :

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