Генерация конструктора - PullRequest
1 голос
/ 28 марта 2019

Мое задание просит создать конструктор, который не требует ввода. Конструктор инициализирует два нестатических атрибута, чтобы они представляли стандартную колоду или карты. Обратите внимание, что это означает, что массив карт должен быть инициализирован массивом из 52 элементов, содержащим все 52 возможных карты, принадлежащих стандартной колоде. Для этого вы должны использовать как минимум 1 цикл (то есть вы не можете написать 52 оператора для назначения всех возможных значений).

Подсказка: если вы создаете массив String размера 4 со всеми возможными значениями мастей, вы можете легко использовать два вложенных цикла для инициализации массива карточек.

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

Вот мой код:

public class Deck {

  // Declare the private attributes

  private Card[] cards;
  private int numberOfCardsLeft;

  // Access the private fields via public methods

  // Generate a constructor

  public Deck() {

    this.cards = new Card[][];

    // Iterate through all the elements of the array

    for (int i = 0; i < 4; i++) {

      // Iterate through all the elements of the subarrays

      for (int j = 0; j < 13; j++) {

        // code missing
      }
    }
  }
}

Вот класс Карты:

public class Card {

  // Declare the private attributes

  private int cardValue;
  private String cardSuit;


  // Access the private fields via public methods

  // Generate a constuctor

  public Card(int value, String suit) {

    this.cardValue = value;
    this.cardSuit = suit.toLowerCase();

    // Check if the input is a valid playing card

    if (!(this.cardValue >= 1 || this.cardValue <= 13) && (this.cardSuit.equals("spades") || this.cardSuit.equals("hearts") || this.cardSuit.equals("diamonds") || this.cardSuit.equals("clubs"))) {

      // Throw an IllegalArgumentException

      throw new IllegalArgumentException("This is not a valid playing card!");
    }
  }

  public int getValue() {

    return cardValue;
  }

  public String getSuit() {

    return cardSuit;
  }
}

Вот мой метод getCards ():

// A get() method that returns an array of Cards containing all the cards that are left in the deck

public Card[] getCards() {

  // Create a copy of the original array

  Card[] cardsLeft = new Card[cards.length];

  // Iterate through all the elements of the array

  for (int i = 0; i < cardsLeft.length; i++) {

    cardsLeft[i] = cards[i];
  }

  return cardsLeft;
}

1 Ответ

1 голос
/ 28 марта 2019

Прежде всего, вам нужно множество костюмов:

String[] suits = new String[]{"clubs", "hearts", "spades", "diamonds"};

Для инициализации одномерного массива вы можете использовать следующий код:

Card[] cards = new Card[52];
for (int i = 0; i < suits.length; i++) {
    for (int j = 0; j < 13; j++) {
        cards[i * 13 + j] = new Card(j + 1, suits[i]);
    }
}

Если вам нужен двумерный массив, используйте:

Card[][] cards = new Card[4][13];
for (int i = 0; i < suits.length; i++) {
    for (int j = 0; j < 13; j++) {
        cards[i][j] = new Card(j + 1, suits[i]);
    }
}

В конце условие в вашем классе Card всегда равно false, потому что !(this.cardValue >= 1 || this.cardValue <= 13) всегда ложно. Я полагаю, вы ищете что-то вроде этого:

if (this.cardValue < 1 || this.cardValue > 13 ||
        !(this.cardSuit.equals("spades") || this.cardSuit.equals("hearts") ||
                this.cardSuit.equals("diamonds") || this.cardSuit.equals("clubs"))) {
    throw new IllegalArgumentException("This is not a valid playing card!");
}

Ваш getCards() метод выглядит хорошо и работает как положено. Вот еще несколько вариантов копирования массива:

  1. Arrays.copyOf():
Card[] cardsCopy = Arrays.copyOf(cards, cards.length);
  1. System.arraycopy():
Card[] cardsCopy = new Card[cards.length];
System.arraycopy(cards, 0, copy3, 0, cards.length);
  1. Array.clone()
Card[] cardsCopy = cards.clone();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...