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