4

对于我的课堂实验室,我们将制作一个简单的卡片组工具,它可以生成标准卡片组并抽取 5 张卡片。我们刚刚学习了 ArrayList 以及如何制作我们自己的类,但现在我正在尝试将它们放在一起,但它只是没有成功。这是我的基本卡类:

public class Card
{
private String Number;
private String Suit;

public Card()
{
Number = "Joker";
Suit = "Card";
}

我也有一个重载的卡片类,但不包括以节省空间。接下来是基本的甲板类:

public class Deck
{
private ArrayList<Card> CardDeck = new ArrayList<Card>();

public Deck()
{
CardDeck.clear();
CardDeck.add(new Card("Ace","Hearts"));
}

最后,我有我的客户课程。现在,我只是想打印生成的卡片 [Ace,Hearts]。

在我的卡片类中,我有一种打印卡片值的方法:

public String print(Deck a) 
{
  return (this.Number+" of "+this.Suit);
}

但是,我正在努力解决如何打印列表是类的数组列表。我知道现在事情有点混乱(我不打算打印套牌),但我认为跳过这个障碍比继续制作手牌列表更重要。问题是一样的,只是变量名称不同。

我试着在网站上寻找类似的问题,但大多数要么只是 String 对象,要么不一起使用 arraylist。

4

6 回答 6

3

首先,一个小术语:你的ArrayList不包含类,它包含对 Card 对象实例的引用。Card 类型在 ArrayList 声明中用于指示 ArrayList 中的所有内容都是 Card,但在其他任何地方都没有class引用 Card 的类型。

现在,如果您只想将卡片打印到控制台,toString为了方便起见,我建议您覆盖该方法。目前,如果您尝试:

System.out.println(aCard);

你会得到一个内存地址。覆盖 Card 的 toString,您可以自定义此输出。例如:

public String toString() { //In your Card class
    return "["+this.Number+", "+this.Suit+"]";
}

试着只打印一张卡片,这样你就可以看到它是如何工作的。

然后,要遍历 CardDeck 的每个成员,只需使用 for each 语法:

for(Card c : CardDeck)
    System.out.println(c);
于 2013-04-12T06:33:12.370 回答
3

如果你想从 Cred 类中打印值,那很好,但是如果你想从类外部打印它,那么你需要添加任何私有变量的公共 getter 方法。
现在,如果您只是尝试从外部打印对象值,那么您需要覆盖 toString() 方法:

public String toString(){
    return("Number = "+this.Number+" and Suit = "+this.Suit);
}

如果你想在课外打印,那么
像这样改变你的 Card 类:

public class Card
{
private String Number;
private String Suit;

public Card(String Number,String Suit)
{
this.Number=Number;
this.Suit=Suit;
}

public String getNumber() {
    return Number;
}

public void setNumber(String number) {
    Number = number;
}

public String getSuit() {
    return Suit;
}

public void setSuit(String suit) {
    Suit = suit;
}
}

然后你可以像这样打印值:

List<Card> cardList = new ArrayList<Card>();
//Put some value in the list.
cardList.add(new Card("Ace","Hearts"));
//And so on..
    for (Card card : cardList) {
        System.out.println("Number = "+card.getNumber()+" Suit = "+card.getSuit());
    }
于 2013-04-12T06:40:23.313 回答
1

您可以迭代 ArrayList 并以您想要的方式打印每个 Card。

for (Card card : cardDesk) {
    System.out.println(String.format("Card number: %s, suit: %s", card.getNumber(), card.getSuit());
}

同样,如果您想返回打印内容而不是输出到控制台,您可以使用 StringBuilder 而不是 Sysout。

也请使用 CamelCase 命名您的变量作为其最佳实践。

于 2013-04-12T06:32:35.500 回答
1

您的 Card 类中不应该有 print(Deck a) 方法,Card 类必须只知道如何自己打印它(在面向对象编程中称为单一职责原则)

假设你有一个 print 方法(也考虑覆盖 toString 方法)

public String print(){
    return (this.Number+" of "+this.Suit);
}

请注意,它不接受任何参数,因为 Card 实例知道自己。

还在 Deck 类中添加一个 printCards 方法

public void printCards(){
    for (Card card: CardDeck){
         System.out.println(card.print());
    }
}
于 2013-04-12T06:34:22.160 回答
1

只需迭代您ArrayList CardDeck并调用每个元素print()方法

for (Card card : CardDeck) {
     card.print();
}
于 2013-04-12T06:37:04.867 回答
1

首先,您的 Card 构造函数不好,应该是:

public Card(String number, String suit) {
this.number = number;
this.suit = suit;
}

Card的存取方法:

public String getNumber(){
    return number;
}

西装也一样

现在您可以创建一张卡片并将其添加到套牌中:

CardDeck.add(new Card("Ace","Hearts"));

现在打印甲板;

StringBuilder b = new StringBuilder();
for(Card c: cardDeck){
    b.append(c.getNumber).append(c.getSuit);
}
return b.toString();
于 2013-04-12T07:02:42.493 回答