Java Сортировка объекта в ArrayList - PullRequest
5 голосов
/ 26 апреля 2009

Привет, у меня есть класс Card ... В другом классе я создаю arrayList объектов Card. Как бы я пошел о сортировке arrayList на основе значения карты? Туз - самая низкая ценность карты, а король - самая высокая.

А, 2,3,4,5,6,7,8,9, Т, 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;
    }

}

Ответы [ 8 ]

10 голосов
/ 26 апреля 2009

Код был бы намного чище, если бы вы использовали enum для представления ранга и набора вместо символа.

На самом деле, http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html имеет образец карты, иллюстрирующий использование 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;
    }
}
9 голосов
/ 26 апреля 2009

Один из вариантов - реализовать интерфейс Comparable, а затем переопределить сравнение. Как только вы это сделаете, сортировка списка станет простой с Collections.sort (myCollection);

Возможно, вам лучше избегать реализации Comparable и создавать Comparator объект, и есть версия Collections.sort, которая использует компаратор.

Ваша функция сравнения может затем просто проверить ранг карт и вернуть результат, игнорируя масть.

Возможно, вы захотите прочитать учебник по Java на по всему этому заказу .

Обновление: Бьорн правильно указывает, что Comparable следует использовать, когда класс имеет естественный порядок сортировки. Мое личное мнение таково, что для карт на самом деле не существует «естественного порядка», поскольку разные игры по-разному интерпретируют туз, поэтому, возможно, лучше не назначать «семантику», предлагая Comparable как часть класса.

4 голосов
/ 27 апреля 2009

Отсутствующий код сравнения:

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 голос
/ 12 июля 2011
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 голос
/ 26 апреля 2009

Несколько более коротких методов

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

public boolean isValidCard(){
    return "HSDC".indexOf(suit) != -1 &&
         "A23456789TJQK".indexOf(rand) != -1;
}
1 голос
/ 26 апреля 2009

Вы можете использовать класс 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.

Для первого метода вы должны заставить свой класс Card реализовать интерфейс 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);
1 голос
/ 26 апреля 2009

Вы можете реализовать интерфейс Comparable так, чтобы элементы сравнивались по рангу. Тогда Collections.sort автоматически сделает то, что вы ожидаете.

0 голосов
/ 26 июня 2015
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;
        }
    }
    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...