【问题标题】:An ArrayList of classes. Confused类的 ArrayList。使困惑
【发布时间】:2013-04-04 13:48:32
【问题描述】:

对于我的课堂实验室,我们将制作一个简单的卡片组工具,它可以生成标准卡片组并抽取 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。

【问题讨论】:

  • 您可以通过使用foreach loop 遍历其元素来打印列表的内容。如果你用谷歌搜索“java foreach loop”,你应该会找到一些有用的信息。在您的情况下,您似乎会使用 foreach a 循环遍历列表中的每张卡片。在循环中,您将调用每张卡片的 print() 方法。由于这显然是家庭作业,因此我将避免提供复制/粘贴答案。
  • 我还建议您阅读toString() 方法。另请阅读java naming conventions
  • @jahroy 感谢您的正直。我不是在使用这个网站作弊或寻找简单的答案。我是来学习的。谢谢你不只是给出答案。 @predi 正如我刚刚发布的更进一步,我的印象是更改 toString() 方法会弄乱不相关的 sysout 语句。我猜那是不正确的。我们尚未涵盖命名标准。我会将其添加为书签以供以后阅读,因为如果我回到这个小程序,它将使阅读代码更容易。

标签: java class syntax arraylist coding-style


【解决方案1】:

您可以迭代 ArrayList 并按照您想要的方式打印每张卡片。

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

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

另外,最好使用 CamelCase 命名变量。

【讨论】:

    【解决方案2】:

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

    现在,如果您只想将卡片打印到控制台,我建议您重写 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);
    

    【讨论】:

    • 这可能是我搜索时找不到任何东西的原因。术语就是一切。谢谢您的意见!我试图避免覆盖toString,因为出于某种原因,我认为它会弄乱正常的 sysout 语句。所以澄清一下,由于 Deck 只是一个对象卡片的数组列表,我可以使用Deck.CardDeck.get(0) 来指定某个卡片吗?还是我会采取不同的方式?
    • 嗯,通过Deck.CardDeck.get 引用它意味着两件事:首先,CardDeck 在 Deck 中是公共的,其次,CardDeck 在 Deck 中是静态的。但是,总的来说,是的
    • ArrayList 包含对对象实例的引用,而不是对象本身。
    • @predi 嗯,小细节,小细节……已编辑
    • 魔鬼通常藏身的地方。
    【解决方案3】:

    你的 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());
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果你想从 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());
            }
        

        【讨论】:

        • 创建一个公共方法似乎是在其类之外打印的明智选择,因为这就是我要做的。
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-22
          • 1970-01-01
          • 2023-03-29
          • 2020-04-19
          相关资源
          最近更新 更多