Cómo inicializar una matriz de objetos en Java

79

Quiero inicializar una serie de objetos Player para un juego de BlackJack. He leído mucho sobre varias formas de inicializar objetos primitivos como una matriz de entradas o una matriz de cadenas, pero no puedo llevar el concepto a lo que estoy tratando de hacer aquí (ver más abajo). Me gustaría devolver una matriz de objetos Player inicializados. El número de objetos de jugador para crear es un número entero que le pregunto al usuario. Estaba pensando que el constructor podría aceptar un valor entero y nombrar al jugador en consecuencia mientras inicializaba algunas variables miembro del objeto Player. Creo que estoy cerca, pero todavía estoy bastante confundido.

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

EDITAR - ACTUALIZAR: Esto es lo que obtengo después de cambiar esto, ya que entendí su sugerencia:

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
fuente
¿Hay alguna razón por la que la Playerclase de suero sea ​​estática? ¿Puede intentar quitarle la staticpalabra clave?
OK - Intenté eliminar "estático" y el compilador marcó lo siguiente: thePlayers [i] = new Player (i);
John Adams
Algo como esto pastie.org/1865618 debería compilarse.
Bala R

Respuestas:

98

Está casi bien. Solo tienes:

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

Y deja que el bucle sea:

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

Y tenga en cuenta que la convención de Java dicta que los nombres de métodos y variables deben comenzar con minúsculas.

Actualización: coloque su método dentro del cuerpo de la clase.

Bozho
fuente
1
No estoy seguro de a qué te refieres aquí. Tengo un constructor dentro de la clase Player. ¿Te refieres a poner InitializePlayers dentro de la clase Player también?
John Adams
1
@John Galt sí. No puede ser fuera de clase
Bozho
@Powerlord Aunque puede contener las convenciones más utilizadas y proporcionar buenas sugerencias, estoy bastante seguro de que la mitad de los elementos de ese documento son demasiado oscuros para ser considerados convenciones.
twiz
@twiz Para ser justos, ese documento son las convenciones de programación que Oracle née Sun tiene sus propios desarrolladores que usan. No he revisado el código de OpenJDK para ver qué tan bien se siguieron.
Powerlord
1
@Powerlord Code Conventions para Java Programming Language es el nuevo (antiguo) hogar.
23

En vez de

Player[PlayerCount] thePlayers;

usted quiere

Player[] thePlayers = new Player[PlayerCount];

y

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

debería devolver la matriz inicializada con instancias de Player.

EDITAR:

Consulte esta tabla en wikipedia sobre convenciones de nomenclatura para Java que se usa ampliamente.

Bala R
fuente
¿No creará esto pérdidas de memoria cuando reinicialice la matriz de reproductores es el bucle?
14

Si no está seguro del tamaño de la matriz o si puede cambiar, puede hacer esto para tener una matriz estática.

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
fuente
1
PreferiríaList<Player> thePlayersList = new ArrayList<Player>();
Deqing
2
@Deqing En ese caso prefiero Object thePlayersList = new ArrayList<Player>();.
Joel Sjögren
@Deqing Eso realmente se ejecutará de manera diferente en el caso de sobrecarga.
Neel
9

Si puede codificar el número de jugadores

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

Las matrices no se pueden cambiar después de la inicialización. Tienes que darle un valor, y ese valor es lo que permanece la longitud de la matriz. Puede crear múltiples matrices para contener ciertas partes de la información del jugador como su mano y tal, y luego crear una lista de matrices para guiar esas matrices.

Otro punto de discordia que veo, y puedo estar equivocado sobre esto, es el hecho de que su Player privado [] InitializePlayers () es estático donde la clase ahora es no estática. Entonces:

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

Mi último punto sería que probablemente debería haber declarado playerCount fuera del método que lo va a cambiar para que el valor que se le asigna se convierta en el nuevo valor también y no se descarte al final del método "alcance."

Espero que esto ayude

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

thePlayers[i] = new Player(i); Acabo de borrar el iinterior Player(i); Y funcionó.

por lo que la línea de código debería ser:

thePlayers[i] = new Player9();
Ali yasar Erdogan
fuente
Creo que se debe a la forma en que definió al jugador, por public Player(int i)lo que inicialmente debería tomar una entrada entera.
dexhunter