How to initialize an array of objects in Java

JavaArraysObjectInitialization

Java Problem Overview


I want to initialize an array of Player objects for a BlackJack game. I've read a lot about various ways to initialize primitive objects like an array of ints or an array of strings but I cannot take the concept to what I am trying to do here (see below). I would like to return an array of initialized Player objects. The number of player objects to create is an integer for which I prompt the user. I was thinking the constructor could accept an integer value and name the player accordingly while initializing some member variables of the Player object. I think I am close but still quite confused too.

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;
}

EDIT - UPDATE: Here is what I am getting after changing this as I understood your suggestion:

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	

Java Solutions


Solution 1 - Java

It is almost fine. Just have:

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

And let the loop be:

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

And note that java convention dictates that names of methods and variables should start with lower-case.

Update: put your method within the class body.

Solution 2 - Java

Instead of

Player[PlayerCount] thePlayers;

you want

Player[] thePlayers = new Player[PlayerCount];

and

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

should return the array initialized with Player instances.

EDIT:

Do check out this table on wikipedia on naming conventions for java that is widely used.

Solution 3 - Java

If you are unsure of the size of the array or if it can change you can do this to have a static array.

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

Solution 4 - Java

If you can hard-code the number of players

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

Solution 5 - Java

Arrays are not changeable after initialization. You have to give it a value, and that value is what that array length stays. You can create multiple arrays to contain certain parts of player information like their hand and such, and then create an arrayList to sort of shepherd those arrays.

Another point of contention I see, and I may be wrong about this, is the fact that your private Player[] InitializePlayers() is static where the class is now non-static. So:

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

My last point would be that you should probably have playerCount declared outside of the method that is going to change it so that the value that is set to it becomes the new value as well and it is not just tossed away at the end of the method's "scope."

Hope this helps

Solution 6 - Java

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

Solution 7 - Java

thePlayers[i] = new Player(i); I just deleted the i inside Player(i); and it worked.

so the code line should be:

thePlayers[i] = new Player9();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohn AdamsView Question on Stackoverflow
Solution 1 - JavaBozhoView Answer on Stackoverflow
Solution 2 - JavaBala RView Answer on Stackoverflow
Solution 3 - JavaUgur KumruView Answer on Stackoverflow
Solution 4 - JavaJohn HenckelView Answer on Stackoverflow
Solution 5 - JavaDragoons299View Answer on Stackoverflow
Solution 6 - JavadigitebsView Answer on Stackoverflow
Solution 7 - JavaAli yasar ErdoganView Answer on Stackoverflow