[java] Java에서 객체 배열을 초기화하는 방법

BlackJack 게임을 위해 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



답변

거의 괜찮습니다. 그냥 가지고 :

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

그리고 루프를 다음과 같이 두십시오.

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

그리고 자바 규칙은 메소드와 변수의 이름이 소문자로 시작해야한다고 규정하고 있습니다.

업데이트 : 클래스 본문에 메소드를 넣으십시오.


답변

대신에

Player[PlayerCount] thePlayers;

당신은 원합니다

Player[] thePlayers = new Player[PlayerCount];

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

Player 인스턴스로 초기화 된 배열을 반환해야합니다.

편집하다:

널리 사용되는 Java의 명명 규칙에 대한 위키피디아의이 표를 확인하십시오 .


답변

배열의 크기를 잘 모르거나 변경할 수있는 경우이 작업을 수행하여 정적 배열을 가질 수 있습니다.

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


답변

플레이어 수를 하드 코딩 할 수있는 경우

Player[] thePlayers = {
    new Player(0),
    new Player(1),
    new Player(2),
    new Player(3)
};


답변

초기화 후에는 배열을 변경할 수 없습니다. 당신은 그것에 값을 주어야하고, 그 값은 배열 길이가 유지되는 것입니다. 손과 같은 플레이어 정보의 특정 부분을 포함하는 여러 배열을 만든 다음 arrayList를 만들어 이러한 배열을 셰퍼드 할 수 있습니다.

내가 본 또 다른 논쟁 점은 이것에 대해 틀렸을 수 있는데, 당신의 개인 Player [] InitializePlayers ()가 현재 클래스가 정적이 아닌 곳에서 정적이라는 사실입니다. 그래서:

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

내 마지막 요점은 아마도 playerCount를 변경하려는 메서드 외부에 선언하여 설정 한 값도 새 값이되고 메서드의 끝에서 버려지지 않도록해야한다는 것입니다. “범위.”

도움이 되었기를 바랍니다


답변

Player[] players = Stream.iterate(0, x-> x+1 ).limit(PlayerCount).map(i -> new Player(i)).toArray(Player[]::new);


답변

thePlayers[i] = new Player(i); 방금 i내부를 삭제했습니다 Player(i). 그리고 그것은 작동했습니다.

따라서 코드 줄은 다음과 같아야합니다.

thePlayers[i] = new Player9();