Сейчас я работаю над этим заданием, для которого я выполнил большую часть работы на данный момент.Он содержит 2 пакета, один из которых называется дженерики, в которых расположены классы обработки исключений, интерфейс (в данном случае StackADT) и методы стека (pop (), peek () и push ()).Другой называется «лаборатория», где класс карты в определенном и ее содержание, равное рангу
public String getRankAsString() {
String[] ranks = "2", "3", "4", "5", "6",
"7", "8", "9", "10", "J", "Q", "K", "A"
return ranks[rank];
}
и масти
public String getSuitAsString() {
String[] suits = { "Clubs", "Diamonds",
"Hearts", "Spades" };
return suits[suit];
}
равно, сравнивает, имеют ли 2 карты одинаковый ранг и масть.
public boolean equals(Card otherCard) {
return ((rank == otherCard.rank) &&
(suit == otherCard.suit));
}
I was supposed to create 2 classes within the lab package, one called LabApp (where the testing would happen) and DiscardPile, a subclass of Stack<T> and would contain a method "discardTopCard", method called removeTopCards which accepts a reference to a Card object called theCard. This method will allow the user to request that all cards up to and including theCard be removed from the discard pile and returned in an array, thus the return-type of the method is Card[]. This is what I have for removeTopCard atm.
public Card[] removeTopCard(Card otherCard) throws StackEmptyException {
Card[] theCard = new Card[size()];
int i = 0;
boolean check = false;
if(isEmpty()){ //in the case that there's nothing there
throw new StackEmptyException("Stack is Empty");
}
while(!isEmpty()){ //If it's not empty, pop the top card (unlimited loop that'll need to be broken by a break;)
Card top = (Card) pop(); //Casts Card to pop, which should remove it
theCard[i] = top; //removed and returned in an array
i++;
if(top.equals(otherCard)){ //checks if the card's rank and suit are the same and stops the loop if true
check = true;
break; //it ends the loop if they're equivalent, all of those cards were set to top
}
}
if(!check){ //if it can't find anything
throw new StackEmptyException("Card not found");
}
Card[] topCards = new Card[i];
for(int j = 0;j < i; j++){
topCards[j] = theCard[j]; //set the discarded value array to theCard
}
return topCards; //should return the popped numbers
}
Я думаю, что это может работать просто отлично.
В LabApp, метод тестирования, у меня в настоящее время есть
import generics.StackFullException;
import generics.StackEmptyException;
public class Lab4App {
public static void main(String[] args)throws StackFullException, StackEmptyException {
try {
DiscardPile<Card> discardPile = null;
discardPile = new DiscardPile<Card>();
discardPile.push(new Card(8));
discardPile.push(new Card(32));
discardPile.push(new Card(48));
discardPile.push(new Card(2));
discardPile.push(new Card(17));
discardPile.push(new Card(20)); //removeTopCard should remove all that's above
discardPile.push(new Card(25));
discardPile.push(new Card(50));
discardPile.push(new Card(19));
discardPile.push(new Card(41)); //10 Cards that must be popped
for(int i = 0; i < discardPile.getSize(); i++) {
Card var = discardPile.pop(); //pops the cards that are above
System.out.println(var.getRankAsString() + " of " + var.getSuitAsString());
}
}
catch (StackEmptyException SEE) {
System.out.println("StackEmptyException: " + SEE.getMessage());
}
catch (StackFullException SFE) {
System.out.println("StackFullException: " + SFE.getMessage());
}
}
}
Он печатает желаемый вывод
4 of Spades
8 of Diamonds
K of Spades
A of Diamonds
9 of Diamonds
6 of Diamonds
4 of Clubs
J of Spades
8 of Hearts
10 of Clubs
но он возвращает
Exception in thread "main" java.util.EmptyStackException
в конце
Я создал конструктор по умолчанию
public class DiscardPile<T> extends Stack<T> { //subclass of its parent Stack
private T[] data;
private int size;
//private static final int maxSize = 52;
public DiscardPile() throws StackFullException, StackEmptyException {
//this.data = (T[]) new Object[maxSize];
this.size = 52; //52 is supposed to be the max value
}
/**
* Constructs a new Stack with capacity specified by user
* @param size the size of the Stack
*/
public DiscardPile(int size){
//this.data = (T[]) new Object[size];
this.size = 0;
}
public int getSize(){ // getter
return this.size;
}
Если я введу 10 вместо 52,в конце он работает без ошибок (так как есть 10 карт), если я введу 0, он просто не печатается.
Я также должен написать вызов метода removeTopCards.и протестируйте метод, передав ссылку на карту, целочисленное значение которой равно 20. Выходные данные должны выглядеть следующим образом в следующем порядке.
9 of Diamonds
A of Diamonds
K of Spades
8 of Diamonds
4 of Spades
Я знаю, что должен сделать это как
discardPile.removeTopCard(new Card(20));
но я не знаю, как бы я распечатал его через цикл for.Может быть, это должно быть сделано так?
for(int j = 0; j < discardPile.getSize(); j++) {
Card vari = discardPile.push();
//pushes the already popped cards onto a stack?
System.out.println(vari.getRankAsString() + " of " + vari.getSuitAsString());
Я знаю, что это довольно долго, но любая помощь будет оценена.Я новичок в JAVA, и я впервые имею дело со стеками любой формы.