【问题标题】:How to print objects nested in arrays in java如何在java中打印嵌套在数组中的对象
【发布时间】:2011-03-06 16:03:58
【问题描述】:

我正在创建的纸牌游戏程序应该提示用户输入玩家人数,以及每手有多少张牌,然后洗牌,然后发牌,然后显示每个玩家手中的牌。它将显示所有玩家的手牌,除非牌组中的牌不足(我们不能从 52 张牌的牌组中处理 10 张牌,共 7 张牌)。

我创建了一个 Card 类、一个 Deck 类、一个 Hand 类和驱动程序来运行程序。由于这是一项任务,我必须遵守给定的规则,所以我只能使用数组,而不是数组列表。我的问题是我无法弄清楚如何在 Hand 对象中打印 Card 对象,在 Hands 数组中。也可能有更好的方法来做到这一点,但我仅限于我被允许导入/使用的内容。我可以在哪里寻找嵌套数组中的打印对象获得一些帮助吗?由于没有对象名称,我无法使用在 Hand 类中编写的方法将卡片添加到数组中的 Hands 中。

编辑:我让 Hand 类中的构造函数在传递给它的 int 上创建一个手大小。令人困惑的是,当我从用户那里得到确实有多少玩家在玩游戏时,我在驱动程序中创建了一个 Hand 类型的数组,其中使用循环填充了新的 Hand 对象。那时我不知道如何引用每个单独的手对象,因此我可以使用 toString() 打印内容。他们似乎没有名字。

要遵循的代码:

import java.util.Arrays;
import java.util.Scanner;
public class CardsDriver {

public static void main(String[] args) 
{
    Card c1 = new Card();       //create new card object
    Scanner kb = new Scanner(System.in);
    int cards;
    int players;


    System.out.print("How many players are in the game?");
    players = Integer.parseInt(kb.nextLine());
    System.out.print("\nHow many cards will be dealt to each player?");
    cards = Integer.parseInt(kb.nextLine());

    while ((cards * players) > 52)
    {
        System.out.print("There are not enough cards in the deck to deal " +
                         players + " hands of " + cards + " cards. try again.");

        System.out.print("How many players are in the game?");
        players = Integer.parseInt(kb.nextLine());
        System.out.print("\nHow many cards will be dealt to each player?");
        cards = Integer.parseInt(kb.nextLine());
    }

    Deck readyDeck = new Deck();    //create new deck 
    readyDeck.shuffleDeck();        //shuffle the newly built deck using Java.Util.Random   
    Hand[] playerHands= new Hand[players];  //create another array to hold all player hands

    for(int index =0; index < playerHands.length; index++)
    {
        playerHands[index] = new Hand(cards);   //create hand object for each player of the size input by the player
        /*for (int index2 =0; index2<cards;index2++)
        {
            //fill each hand with cards using addcard somehow. i have no object name.
            Hand.addCard(readyDeck.dealACard());
        }*/
    }
}

【问题讨论】:

  • 我不明白...问题是什么? :-\ 但我会回答“覆盖 toString”方法....这是最有可能的答案。

标签: java arrays object nested


【解决方案1】:

假设您已经覆盖了每个提到的类的toString 方法,打印出数组应该像调用Arrays.toString() 方法一样简单(而不是仅仅将数组引用传递给System.out.println() 及其变体。

如果您想知道它如何处理嵌套数组,Deck 类的 toString() 方法将涉及调​​用 Card 数组上的 Arrays.toString 方法。

例子:

class Card {

    int suit, rank;

    @Override
    public String toString() {
        // outputs something like ACE of SPADE
        return suitToName(suit) + " of " + rankToName(rank);
    }

}

class Deck {

    private Card[] cards;

    private String name;

    @Override
    public String toString() {
        // prints : MyDeck -> [ACE of SPADE, ACE of HEART] etc.
        return name + " -> " + Arrays.toString(cards);
    }

}

顺便说一句,我认为您应该枚举 Rank 和 Suits 而不是摆弄整数。我应该说那会更干净。

【讨论】:

  • 我遇到的问题是我很困惑传递给 toString 方法的内容,因为我没有 Card 或 Hand 对象的实际名称。它们是在循环中创建的,我可能会遗漏一些东西。
  • @sudoshakes:我认为您对toString 方法的使用感到困惑;查看我的更新答案。
  • 我使用的是枚举,但是传递给方法的整数被 mod 分割得到一个枚举
  • @sudoshakes:这首先违背了使用枚举的目的。您可以将字段与枚举常量相关联(1 表示 ACE,2 表示 HEART)。我认为您应该将问题拆分为更简单的问题并删除用户输入部分以减少混乱。
【解决方案2】:

正如 Sanjay 建议的那样,您应该将其添加到您的 Card 类中:

@Override 
public String toString() {
...
}

然后,只要您想打印 Card 对象,无论它在哪里,都只需使用 cardinstance.toString()

我不知道您要完成什么,但这里有一个很好的 java 编程示例(用于创建德州扑克)。

http://code.google.com/p/texasholdem-java/source/checkout

检查一下,看看它是如何正确完成的,你可以玩任何纸牌游戏。

【讨论】:

  • Card 类的构造函数使用传递整数创建卡片,并使用 mod 除法返回枚举的面和花色类型的序数值。
  • 哎呀进入太快了。然后我让 Hand 类中的构造函数在传递给它的 int 上创建一个手大小。令人困惑的是,当我得到确实有多少玩家在玩游戏时,我在驱动程序中创建了一个类型为手的数组,其中使用循环填充了新的手对象。那时我不知道如何引用每个单独的手对象,因此我可以使用 toString() 打印内容。
  • @sudoshakes 抱歉现在时间不多了,你能在调试模式下捕捉到它吗?
  • 没有编译或运行时错误。我只是不知道如何在 Hand 对象数组中的各个 Hand 对象中引用各个 Card 对象。
【解决方案3】:

要覆盖它,您可以在较新版本的 Eclipse 中使用新向导,也可以使用我曾经编写的 JUtils ToString Generator 之类的插件。

【讨论】:

  • 我意识到我可以覆盖 toString() 方法,我不知道如何在 Hand 对象数组中的 Hand 对象内的卡片上使用它。
猜你喜欢
  • 1970-01-01
  • 2021-06-25
  • 2021-03-07
  • 2022-09-22
  • 2016-03-15
  • 1970-01-01
  • 2013-03-11
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多