Генерация конструктора

#java #constructor #sub-array

#java #конструктор #подмассив

Вопрос:

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

Подсказка: Если вы создадите массив строк размером 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
      }
    }
  }
}
  

Вот класс Card:

 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) amp;amp; (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. Card[][] cards = new Cards[4][13] : 4 масти, всего 52 карты

2. Почему многомерный массив? Не могли бы вы поделиться кодом Card (или, по крайней мере, его подписью)? Исходя из многомерности, ваш подход хорош. Просто добавьте карточку в массив в той части, которую вы написали code misssing

3. @fantaghirocco Разве это не Card[4][13]?

4. Вы не можете инициализировать одномерный массив с помощью двумерного массива

5. @Elizabeth это должно быть Card[52]

Ответ №1:

Прежде всего, вы должны создать массив исков:

 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) всегда равно false. Я предполагаю, что вы ищете что-то вроде этого:

 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();
  

Комментарии:

1. Разве это не были бы карты [i] [j] = новая карта (масти [i], j 1);?

2. И не является ли String[] suits = {«пики», «червы», «бубны», «трефы»}; эквивалентом первого оператора?

3. Тогда подмассивом должен быть new Card[13][4]

4. Нет, я имею в виду, что мы можем отбросить новую строку[] перед присвоением имен мастям

5. И подмассивом должен быть new Card[13][4]