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


79

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클래스가 정적 인 이유 가 있습니까? 당신 static은 그것에서 키워드를 제거 할 수 있습니까?

확인- "정적"제거를 시도했고 컴파일러에서 다음 플래그를 지정했습니다. thePlayers [i] = new Player (i);
John Adams

pastie.org/1865618 과 같은 것이 컴파일되어야합니다.
Bala R

답변:


98

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

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

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

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

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

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


1
여기서 무슨 뜻인지 잘 모르겠습니다. Player 클래스 안에 생성자가 있습니다. InitializePlayers도 Player 클래스 안에 넣는다는 뜻입니까?
John Adams

1
@John Galt 그렇습니다. 수업 밖에있을 수 없습니다
Bozho 2011 년

@Powerlord 널리 사용되는 규칙을 포함하고 좋은 제안을 제공 할 수 있지만 해당 문서의 항목 중 절반이 실제로 규칙으로 간주 되기에는 너무 모호하다고 확신합니다.
twiz

@twiz 공평하게 말하면이 문서는 Oracle née Sun이 자체 개발자가 사용하는 프로그래밍 규칙입니다. 나는 그들이 얼마나 따라 갔는지 확인하기 위해 OpenJDK에 코드를 거치지 않았습니다 .
Powerlord

1
Java 프로그래밍 언어에 대한 @Powerlord 코드 규칙 은 새로운 (이전) 홈입니다.

23

대신에

Player[PlayerCount] thePlayers;

당신은 원합니다

Player[] thePlayers = new Player[PlayerCount];

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

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

편집하다:

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


thePlayers 배열을 다시 초기화하면 루프가 발생하면 메모리 누수가 발생하지 않습니까?

14

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

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
내가 선호하는 것List<Player> thePlayersList = new ArrayList<Player>();
더칭

2
@Deqing이 경우 선호합니다 Object thePlayersList = new ArrayList<Player>();.
Joel Sjögren 2014

@Deqing 오버로딩의 경우 실제로 다르게 실행됩니다.
Neel

9

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

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

1

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

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

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

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

도움이 되었기를 바랍니다


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

0

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

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

thePlayers[i] = new Player9();

플레이어를 정의한 방식 때문이라고 생각합니다. public Player(int i)그래서 처음에는 정수 입력을 받아야합니다.
dexhunter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.