Как инициализировать массив объектов в Java - PullRequest
69 голосов
/ 04 мая 2011

Я хочу инициализировать массив объектов Player для игры в блэкджек.Я много читал о различных способах инициализации примитивных объектов, таких как массив целых или массив строк, но я не могу принять концепцию к тому, что я пытаюсь сделать здесь (см. Ниже).Я хотел бы вернуть массив инициализированных объектов Player.Количество создаваемых объектов игрока - это целое число, для которого я запрашиваю пользователя.Я думал, что конструктор может принять целочисленное значение и присвоить имя игроку соответствующим образом при инициализации некоторых переменных-членов объекта Player.Я думаю, что я близок, но все еще в замешательстве.

static class Player
{
    private String Name;
    private int handValue;
    private boolean BlackJack;
    private TheCard[] Hand;

    public Player(int i)
    {
        if (i == 0)
        {
            this.Name = "Dealer"; 
        }
        else
        {
            this.Name = "Player_" + String.valueOf(i);
        }
        this.handValue = 0;
        this.BlackJack = false;
        this.Hand = new TheCard[2];
    } 
}
private static Player[] InitializePlayers(int PlayerCount)
{ //The line below never completes after applying the suggested change
    Player[PlayerCount] thePlayers;
    for(int i = 0; i < PlayerCount + 1; i++)
    {
        thePlayers[i] = new Player(i);
    }
    return thePlayers;
}

РЕДАКТИРОВАТЬ - ОБНОВЛЕНИЕ: Вот что я получаю после изменения этого, как я понял ваше предложение:

Thread [main] (Suspended)   
    ClassNotFoundException(Throwable).<init>(String, Throwable) line: 217   
    ClassNotFoundException(Exception).<init>(String, Throwable) line: not available 
    ClassNotFoundException.<init>(String) line: not available   
    URLClassLoader$1.run() line: not available  
    AccessController.doPrivileged(PrivilegedExceptionAction<T>, AccessControlContext) line: not available [native method]   
    Launcher$ExtClassLoader(URLClassLoader).findClass(String) line: not available   
    Launcher$ExtClassLoader.findClass(String) line: not available   
    Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean) line: not available 
    Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: not available 
    Launcher$AppClassLoader.loadClass(String, boolean) line: not available  
    Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not available  
    BlackJackCardGame.InitializePlayers(int) line: 30   
    BlackJackCardGame.main(String[]) line: 249  

Ответы [ 5 ]

91 голосов
/ 04 мая 2011

Это почти нормально.Просто имейте:

Player[] thePlayers = new Player[playerCount + 1];

И позвольте циклу быть:1008 * Обновление: поместите ваш метод в тело класса.

21 голосов
/ 04 мая 2011

вместо

Player[PlayerCount] thePlayers;

хочешь

Player[] thePlayers = new Player[PlayerCount];

и

for(int i = 0; i < PlayerCount ; i++)
{
    thePlayers[i] = new Player(i);
}
return thePlayers;

должен вернуть массив, инициализированный экземплярами Player.

EDIT:

Извлеките эту таблицу из Википедии о соглашениях по присвоению имен для Java, которая широко используется.

14 голосов
/ 15 июня 2011

Если вы не уверены в размере массива или можете изменить его, вы можете сделать это, чтобы получить статический массив.

ArrayList<Player> thePlayersList = new ArrayList<Player>(); 

thePlayersList.add(new Player(1));
thePlayersList.add(new Player(2));
.
.
//Some code here that changes the number of players e.g

Players[] thePlayers = thePlayersList.toArray();
1 голос
/ 18 апреля 2013

Массивы не могут быть изменены после инициализации. Вы должны дать ему значение, и это значение останется на том же уровне. Вы можете создать несколько массивов, которые будут содержать определенные части информации об игроке, например, их руки и тому подобное, а затем создать arrayList для сортировки этих массивов.

Еще одним спорным вопросом, который я вижу, и я могу ошибаться по этому поводу, является тот факт, что ваш приватный Player [] InitializePlayers () является статическим, когда класс теперь нестатический. Итак:

private Player[] InitializePlayers(int playerCount)
{
 ...
}

Мое последнее замечание: у вас, вероятно, должен быть объявлен playerCount вне метода, который собирается его изменить, так чтобы значение, установленное для него, также стало новым значением, и его не просто отбрасывали в конце области действия метода

Надеюсь, это поможет

0 голосов
/ 02 июля 2015

thePlayers[i] = new Player(i); Я только что удалил i внутри Player(i); и это сработало.

поэтому строка кода должна быть:

thePlayers[i] = new Player9();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...