Я создаю простую карточную игру, и я хочу иметь возможность сортировать 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
Я не совсем уверен, что я делаю неправильно. Любая помощь будет принята с благодарностью!
вам необходимо реализовать интерфейс Comparable, например:
public class Card implements Comparable<Card> {
определите этот класс вне класса вашей карты:
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.
Comparator.naturalOrder()
сортироваться так же, как new CardComparator()
?
Сообщение об ошибке довольно информативно.
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())