“在类中存储”对象是什么意思?

3

我正在做一个Java的作业,题目说:

第4章的编程项目讨论了一个表示标准纸牌的Card类。 创建一个名为DeckofCards的类,用于存储52个Card类的对象。 包括洗牌、发牌和报告剩余牌数的方法。 洗牌方法应该假设你有一整副牌。 创建一个带有主方法的驱动类,该方法从已洗过的牌中发出每张卡牌,并在发出每张卡牌时打印该卡牌。

其中有一句话是:

创建一个名为DeckofCards的类,用于存储52个Card类的对象。

我不确定“存储”指的是什么意思。这是否意味着要在一个类中创建52个对象?或者假设52个对象已经在Card类中制作好了,将所有这些对象放入另一个对象或构造函数中?我确实创建了一个卡牌类,但我没有创建52个对象,因为一副牌有52张牌,所以我认为52个对象和52张牌是相同的。无论如何,如果需要,这是我卡牌类的代码:

import java.util.Random;

public class CardClass {

    private static Random generator = new Random();
    private int suit, num;
    private String cardSuit, cardNum;

    public CardClass() {
        shuffle();
    }

    public void shuffle() {
        num = generator.nextInt(13) + 1; 
        suit = generator.nextInt(4) + 1; 
    }

    public String toString() {
        if (num >=2 && num <= 10)
            cardNum = Integer.toString(num);
        else if (num == 1)
            cardNum = "Ace";
        else if (num == 11)
            cardNum = "Jack";
        else if (num == 12)
            cardNum = "Queen";
        else 
            cardNum = "King";

        if (suit == 1)
            cardSuit = "Spades";
        else if (suit == 2)
            cardSuit = "Hearts";
        else if (suit == 3)
            cardSuit = "Clubs";
        else 
            cardSuit = "Diamonds";

        return cardNum + " of " + cardSuit;     
    }
}

这也是我在这个社区的第一次,如果有任何错误,请原谅,并非常感谢您提供的所有帮助。

3个回答

3

这意味着你的DeckOfCards类应该包含一个大小为52的存储Card实例的数组。你也可以使用另一种数据结构,比如链表。这个数组应该是DeckOfCards中的一个私有属性,例如:

private Card cards[]=new Card[52];

然后,您可以将数组填充为以下Card对象:
for(int i=0;i<52;i++){
    int cardType=i/13;
    String type="Heart";
    if(cardType==0)type="Spades";
    else if(cardType==1)type="Clubs";
    else if(cardType==2)type="Diamond";
    cards[i]=new Card(i, cardType);
}

另外,如果您有编程问题,最好在Stack Overflow上提问。


1
一个很好的思路是将值分配给类的变量(属性)。即使您有多个相同类的对象,每个类也会有其自己的随机值,因为您使用了“Random”类。举个例子,您可以有两个“CardClass”对象,它们都有“cardSuit”和“cardNum”变量,但是这两个对象的“cardSuit”和“cardNum”变量将不同,因为它们是彼此独立的,因为您将值存储到唯一的类对象中。
因此,对于您的问题,似乎被要求将52个值(组成标准牌组的值)存储到数组中。

1
你可能会把类看作是对象的蓝图。对象始终是类的一个实例。对象可以持有同一类或不同类的其他对象:
class A {
    private B someInstanceOfB;
}

现在,Card类应该只包含花色(clubs,diamonds,spades和hearts)和2到10、J、Q、K和A的值。(实际上,这是一个使用enum的理想情况,但为了简单起见,我不会使用它们。) Deck确实包含52个Card对象的数组。请注意,您可能不会两次发同一张牌,因此我们需要有从牌堆中删除牌的可能性。 ArrayList类允许我们这样做:
class Deck {
    private List<Card> cards = new ArrayList<Card>;
}

(你看到的尖括号是泛型的用法。您稍后会了解它。现在,它表示包含Card类型对象的ArrayList。)
现在您需要一些内容来填充数组。Robin的方法填充数组不太好,因为它们的值范围从0到51。相反,您应该使用类似以下内容:
class Deck {

    private List<Card> cards = new ArrayList<Card>();

    public Deck() {
        // Let's assume that 0=clubs, 1=diamonds, 2=spades, 3=hearts
        for (int suit = 0; suit < 4; suit++) {
            // For each suit, we add 13 cards with values 1 through 13.
            for (int value = 1; value <= 13; value++) {
                this.cards.add(new Card(suit, value));
            }
        }
        // We did not yet shuffle the cards,
        //but `Collections.shuffle()` can do the job.
    }

    public void dealRandom() {
        // Pick one of the left cards,
        // remove it from the deck
        // and return it.
    }
}

注意,Card类不应该洗牌,这是Deck的责任。另外,我们使用整数作为卡片类型(花色)和整数作为值。将可读的文本打印来描述卡片可以委托给toString()方法。

当声明private List<Card> cards = new ArrayList<Card>();时,编译器会报错“无法找到符号-List”。顺便说一下,非常感谢您详细的帖子。 - Nub
1
当然,你需要导入适当的类。这两个类都可以在java.util包中找到。顺便问一下,你用的是哪个编辑器? - MC Emperor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接