#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()
метод выглядит хорошо и работает, как ожидалось. Вот еще несколько вариантов копирования массива:
Card[] cardsCopy = Arrays.copyOf(cards, cards.length);
Card[] cardsCopy = new Card[cards.length];
System.arraycopy(cards, 0, copy3, 0, cards.length);
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]