Вопрос:

Как инициализировать массив объектов в Java

java arrays object initialization

593694 просмотра

5 ответа

2098 Репутация автора

Я хочу инициализировать массив объектов 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  
Автор: John Adams Источник Размещён: 04.05.2011 07:46

Ответы (5)


91 плюса

509665 Репутация автора

Решение

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

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

И пусть цикл будет:

for(int i = 0; i < thePlayers.length; i++)

И обратите внимание, что соглашение Java предписывает, чтобы имена методов и переменных начинались со строчных букв.

Обновление: поместите ваш метод в тело класса.

Автор: Bozho Размещён: 04.05.2011 07:48

21 плюса

93945 Репутация автора

Вместо

Player[PlayerCount] thePlayers;

ты хочешь

Player[] thePlayers = new Player[PlayerCount];

а также

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

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

РЕДАКТИРОВАТЬ:

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

Автор: Bala R Размещён: 04.05.2011 07:48

14 плюса

966 Репутация автора

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

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();
Автор: Ugur Kumru Размещён: 15.06.2011 02:35

1 плюс

11 Репутация автора

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

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

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

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

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

Автор: Dragoons299 Размещён: 18.04.2013 02:19

0 плюса

52 Репутация автора

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

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

thePlayers[i] = new Player9();
Автор: Ali yasar Erdogan Размещён: 02.07.2015 07:36
Вопросы из категории :
32x32