Сортировка карточных объектов

1

Я создаю простую карточную игру, и я хочу иметь возможность сортировать ArrayList<Card> чтобы руки игроков были легче читать. Прямо сейчас у меня есть:

Класс карты:

public class Card implements Comparable {

public enum Suits {
    SPADES,
    CLUBS,
    HEARTS,
    DIAMONDS
}

public enum Values {
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN,
    JACK,
    QUEEN,
    KING,
    ACE, 
}

private Suits suit;
private Values value;

public Card(final Values value, final Suits suit) {
    this.value = value;
    this.suit = suit;
}

public Values getValue() {
    return value;
}

public Suits getSuit() {
    return suit;
}

public void showCard() {
    value = getValue();
    suit = getSuit();

    System.out.println(value + " of " + suit);
}

public int compareTo(final Object compareCard) {
    Card compareToCard = (Card) compareCard;
    Suits thisSuit = this.suit;
    Values thisValue = this.value;

    if (thisSuit.ordinal() == compareToCard.getSuit().ordinal() &&
        thisValue.ordinal() == compareToCard.getValue().ordinal()) {
        return 0;
    }
    else if (thisSuit.ordinal() == compareToCard.getSuit().ordinal()) {
        if (thisValue.ordinal() > compareToCard.getValue().ordinal()) {
            return 1;
        }
        else {
            return -1;
        }
    }
    else {
        return -1;
    }
}

}

Я использовал ordinal значения, так как я хочу заказать Значения 2-Ace, и на самом деле не имеет значения, в каком порядке находятся Костюмы, пока они сгруппированы.

Тогда у меня есть ArrayList<Card> называемый playerHand. Я пытаюсь сортировать, используя:

playerHand.sort();

Когда я собираюсь скомпилировать этот код, я получаю сообщение об ошибке:

error: method sort in interface List<E> cannot be applied to given types;
    playerHand.sort();
              ^
  required: Comparator<? super Card>
  found: no arguments
  reason: actual and formal argument lists differ in length
    where E is a type-variable:
    E extends Object declared in interface List

Я не совсем уверен, что я делаю неправильно. Любая помощь будет принята с благодарностью!

  • 0
    вы должны использовать компаратор не сопоставимы?
  • 0
    Читать о Компаратор
Показать ещё 1 комментарий
Теги:
comparator

3 ответа

1
Лучший ответ

вам необходимо реализовать интерфейс Comparable, например:

public class Card implements Comparable<Card> {
  • 0
    он реализует это, но не общий
  • 0
    @ user2397162 он реализует общий Comparable без указания класса
Показать ещё 4 комментария
1

определите этот класс вне класса вашей карты:

class CardComparator implements Comparator<Card>
{

    @Override
    public int compare(Card o1, Card o2) 
    {
         if (o1.getSuit().ordinal() == o2.getSuit().ordinal() && o1.getValue().ordinal() == o2.getValue().ordinal()) 
         {
             return 0;
         }
         else if (o1.getSuit().ordinal() ==o2.getSuit().ordinal()) 
         {
             if (o1.getValue().ordinal() > o2.getValue().ordinal())
                 return 1;                 
             else                  
                 return -1;                
         }
         else
             return -1;    
    }

}

а затем вызовите метод сортировки следующим образом:

playerHand.sort(new CardComparator());

просто не забудьте импортировать java.util.Comparator.

  • 0
    Будет ли Comparator.naturalOrder() сортироваться так же, как new CardComparator() ?
  • 0
    Я пробовал, это не работает, как предполагалось (сортировка неправильно)
Показать ещё 2 комментария
0

Сообщение об ошибке довольно информативно.

required: Comparator<? super Card>
found: no arguments

sort метода в интерфейсе List ожидает аргумент, но вы его не пропустили. Этот аргумент может быть либо Comparator либо null и указывает метод сортировки списка.

Вы уже реализовали интерфейс Comparable. Но это определяет только естественный порядок карт. Если вы хотите отсортировать по этому заказу, вы либо передадите Comparator.naturalOrder() либо просто null. Но если вы хотите отсортировать карты в обратном порядке, вы должны передать Comparator.reverseOrder().

Вы даже можете зайти так далеко и создать два отдельных SuitComparator implements Comparator<Card> а ValueComparator implements Comparator<Card> и сможет комбинировать их по-разному. Например, следующее воссоздает естественный порядок:
new SuitComparator().thenComparing(new ValueComparator())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню