Реализация колоды карт на Java

Вопрос:

Итак, у меня есть лаборатория (нам разрешено искать снаружи, поэтому здесь я много раз царапаю голову), где мы должны реализовать колоду карт. Мы должны использовать класс enum для создания num

Для костюмов:

public enum Suits {
CLUBS, HEARTS, DIAMONDS, SPADES

}

Для чисел:

public enum Numerals {
DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9),
TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);

}

Мой класс карты довольно прост, но я не уверен в этих двух блоках кода:

    public int compareTo (Card aCard){
if (aCard.aNumeral.equals(this.aNumeral) && aCard.aSuit.equals(this.aSuit)){
return 0;
}
else {
return -1;
}
}

а также

    public boolean equals (Card aCard){
if (this.compareTo(aCard) == 0){
return true;
}
else {
return false;
}
}

Теперь для сложной части… Палубы…

Поэтому мы должны реализовать колоду, используя Cloneable, Iterable и Comparator, так что вот что я до сих пор и просто не могу понять, что делать.

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;

public class Deck implements Cloneable, Iterable<Card>, Comparator<Card> {

private ArrayList<Card> cards;

public Deck (){
for (Card c : cards){


}

}

Я изо всех сил пытаюсь собрать конструктора. Я планирую использовать ArrayList для по существу “удержания” 52 отсортированных карточек (как вы можете видеть); но мы должны в конечном счете вернуть отсортированную колоду. Любые предложения о том, куда идти?

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

Чтобы ответить на вопрос о compareTo: a.compareTo(b) должен вернуть что-то отрицательное, если a меньше b, положительное, если a больше b, и 0, если они равны. Кроме того, если вы заказываете объекты, одно из правил, которым должно следовать упорядочение, заключается в том, что если a.compareTo(b) < 0, то b.compareTo(a) > 0. (Вы не можете иметь как ” a меньше b “, так и ” b меньше, чем a “). Ваш compareTo, который просто возвращает -1 любое время, когда карты не равны, не следует этому правилу. Чтобы исправить это, вам нужно будет принять решение о заказе. Как выглядит “сортированная колода”? Вероятно, все клубы вместе, а затем все бриллианты и т.д., Что означает, что любая клубная карта будет меньше любой алмазной карты. Чтобы сделать это правильно, сначала нужно сравнить костюмы, а ряды – только в том случае, если костюмы равны:

public int compareTo (Card aCard){
    int suitCompare = this.aSuit.compareTo(aCard.aSuit);
    if (suitCompare != 0)  {
        return suitCompare;
    }
    return this.aNumeral.compareTo(aCard.aNumeral);
}

compareTo по каждому enum вернет <0, 0 или >0. Таким образом, вы можете сравнить костюмы, вернуть значение <0 или >0, а затем сравнить ранги, если костюмы равны. Это общий подход для написания любого метода compareTo где необходимо проверить несколько фрагментов данных.

Ответ №1

Прежде всего, если ваш enum имеет параметр, вы должны объявить конструктор с параметром:

public enum Numerals {
DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(
10), JACK(11), QUEEN(12), KING(13), ACE(14);
private Numerals(int i) {
this.value = i;
}

int value;
}

Чтобы создать yor deck, вы должны перебирать свои костюмы и цифры и создавать карту для каждой пары:

public Deck() {
for (Suits s : Suits.values()) {
for (Numerals n : Numerals.values()) {
cards.add(new Card(s, n));
}
}
}

From compareTo javadoc: сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.

Поэтому вы должны объявить заказ для вашего класса карты для реализации compareTo (используя ординалы)

public int compareTo(Card o) {
if(this.suit.ordinal() == o.suit.ordinal()){
return this.numeral.ordinal() - o.numeral.ordinal();
}
return this.suit.ordinal() - o.suit.ordinal();
}

Надеюсь, поможет.

PS: будьте осторожны, переопределите метод равных взгляните сюда

Ответ №2

если вы используете идеал, подобный eclipse, он расскажет вам, какие методы вам нужно реализовать для интерфейсов:

import java.util.*;
class Card {}
class Deck implements Cloneable,Iterable<Card>,Comparator<Card> {
public Deck() {}
@Override public int compare(Card arg0,Card arg1) {
// TODO Auto-generated method stub
return 0;
}
@Override public Iterator<Card> iterator() {
// TODO Auto-generated method stub
return null;
}
private ArrayList<Card> cards;
}

итератор прост, так как список массивов имеет один. ищите примеры сопоставимых. вам придется как-то инициализировать колоду. Я поставил статический конечный массив в классе моей карты, который содержал все карты. вы можете сделать все из этого массива, используя массивы в виде списка.

Оцените статью
TechArks.Ru
Добавить комментарий