Java 类的数组列表。困惑的

Java 类的数组列表。困惑的,java,class,syntax,arraylist,coding-style,Java,Class,Syntax,Arraylist,Coding Style,对于我的课堂实验,我们将制作一个简单的卡片组工具,它可以生成一个标准的卡片组并绘制其中的5张。我们刚刚学习了ArrayList以及如何制作我们自己的类,但现在我正试图将它们组合在一起,但却没有成功。这是我的基本卡片类别: public class Card { private String Number; private String Suit; public Card() { Number = "Joker"; Suit = "Card"; } 我也有一个重载的card类,但为了节省空间而

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

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

public Card()
{
Number = "Joker";
Suit = "Card";
}
我也有一个重载的card类,但为了节省空间而排除了它。接下来是基本甲板类:

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

public Deck()
{
CardDeck.clear();
CardDeck.add(new Card("Ace","Hearts"));
}
然而,我正在努力解决如何打印一个列表中包含类的arraylist。我知道现在事情有点混乱(我不打算打印这副牌),但我觉得跳过这一关比继续做一个手工排列列表更重要。问题是一样的,变量的名称不同


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

您可以迭代arraylist,并按照自己的方式打印每张卡片

for (Card card : cardDesk) {
    System.out.println(String.format("Card number: %s, suit: %s", card.getNumber(), card.getSuit());
}
同样,如果希望返回打印内容而不是输出到控制台,则可以使用StringBuilder而不是Sysout


另外,请使用CamelCase将变量命名为其最佳实践。

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

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

System.out.println(aCard);
你会得到一个内存地址。覆盖卡的toString,您可以自定义此输出。例如:

public String toString() { //In your Card class
    return "["+this.Number+", "+this.Suit+"]";
}
试着只打印一张卡片,这样你就可以看到它是如何工作的

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

for(Card c : CardDeck)
    System.out.println(c);

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

假设您有一个print方法(还要考虑重写toString方法)

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

还可以在Deck类中添加printCards方法

public void printCards(){
    for (Card card: CardDeck){
         System.out.println(card.print());
    }
}

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

for (Card card : CardDeck) {
     card.print();
}

如果要打印Cred类中的值,则可以,但如果要从类外部打印此值,则需要添加任何私有变量的公共getter方法。
现在,如果只是尝试从外部打印对象值,则需要重写toString()方法:

如果要在类外打印,则
按以下方式更改您的卡类别:

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());
    }
然后您可以按如下方式打印值:

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());
    }
List cardList=new ArrayList();
//在列表中添加一些值。
卡片列表。添加(新卡片(“Ace”、“红心”);
//等等。。
用于(卡片:卡片列表){
System.out.println(“Number=“+card.getNumber()+”Suit=“+card.getSuit());
}

首先,您的卡构造错误,应该是:

public Card(String number, String suit) {
this.number = number;
this.suit = suit;
}
卡的存取方法:

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

您可以通过使用。如果你在谷歌上搜索“Javaforeach循环”,你会发现一些有用的信息。在您的例子中,看起来您将使用foreach循环迭代列表中的每一张卡。在循环中,您将调用每张卡的print()方法。因为这显然是家庭作业,所以我不会提供复制/粘贴答案。我还建议你们阅读有关方法的内容。另外,请阅读关于我的文章,我欣赏你的正直。我不是在用这个网站作弊或者寻找简单的答案。我是来学习的。谢谢你不仅给出了答案@predi当我刚刚向下发布时,我的印象是修改
toString()
方法会弄乱不相关的sysout语句。我猜那是不对的。我们还没有涉及命名标准。我将把它作为书签,以便以后阅读,因为如果我再回到这个小程序,它将使阅读代码变得更容易。这可能就是我在搜索时找不到任何东西的原因。术语就是一切。谢谢你的意见!我试图避免重写
toString
,因为出于某种原因,我认为它会打乱正常的sysout语句。所以为了澄清一下,因为Deck只是一个对象卡片的数组列表,我可以使用
Deck.CardDeck.get(0)
来指定某张卡片?或者我会换一种方式吗?好吧,通过
Deck.CardDeck.get
引用它意味着两件事:第一,CardDeck在Deck中是公共的,第二,CardDeck在Deck中是静态的。但是,作为一般要点,yes
ArrayList
包含对对象实例的引用,而不是对象本身的引用。@predi-Ehh,小细节,小细节。。。编辑这是魔鬼通常隐藏的地方。制作一个公共方法似乎是在类外打印的明智选择,因为这就是我要做的。
StringBuilder b = new StringBuilder();
for(Card c: cardDeck){
    b.append(c.getNumber).append(c.getSuit);
}
return b.toString();