So initialisieren Sie ein Array von Objekten in Java

79

Ich möchte ein Array von Player-Objekten für ein BlackJack-Spiel initialisieren. Ich habe viel über verschiedene Möglichkeiten gelesen, primitive Objekte wie ein Array von Ints oder ein Array von Strings zu initialisieren, aber ich kann das Konzept nicht auf das übertragen, was ich hier versuche (siehe unten). Ich möchte ein Array initialisierter Player-Objekte zurückgeben. Die Anzahl der zu erstellenden Player-Objekte ist eine Ganzzahl, für die ich den Benutzer auffordere. Ich dachte, der Konstruktor könnte einen ganzzahligen Wert akzeptieren und den Player entsprechend benennen, während einige Mitgliedsvariablen des Player-Objekts initialisiert werden. Ich denke, ich bin nah dran, aber immer noch ziemlich verwirrt.

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: Folgendes erhalte ich, nachdem ich dies geändert habe, da ich Ihren Vorschlag verstanden habe:

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
quelle
Gibt es einen Grund, warum die Molkeklasse Playerstatisch ist? Können Sie vielleicht versuchen, das staticSchlüsselwort daraus zu entfernen ?
OK - Ich habe versucht, "static" zu entfernen, und der Compiler hat Folgendes markiert: thePlayers [i] = new Player (i);
John Adams
So etwas sollte pastie.org/1865618 kompilieren.
Bala R

Antworten:

98

Es ist fast in Ordnung. Nur haben:

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

Und lassen Sie die Schleife sein:

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

Beachten Sie, dass die Java-Konvention vorschreibt, dass Namen von Methoden und Variablen mit Kleinbuchstaben beginnen sollen.

Update: Fügen Sie Ihre Methode in den Klassenkörper ein.

Bozho
quelle
1
Ich bin mir nicht sicher, was du hier meinst. Ich habe einen Konstruktor innerhalb der Klasse Player. Meinen Sie damit, InitializePlayers auch in die Player-Klasse aufzunehmen?
John Adams
1
@ John Galt ja. Es kann nicht außerhalb der Klasse sein
Bozho
@Powerlord Obwohl es möglicherweise die weit verbreiteten Konventionen enthält und gute Vorschläge liefert, bin ich mir ziemlich sicher, dass die Hälfte der Elemente in diesem Dokument viel zu dunkel ist, um tatsächlich als Konventionen betrachtet zu werden.
Twiz
@twiz Um fair zu sein, dieses Dokument ist die Programmierkonvention, die Oracle geborene Sun von seinen eigenen Entwicklern verwendet. Ich habe den Code für OpenJDK nicht durchgesehen, um zu sehen, wie gut sie verfolgt wurden.
Powerlord
1
@ Powerlord Code Conventions für die Java-Programmiersprache ist das neue (alte) Zuhause.
23

Anstatt

Player[PlayerCount] thePlayers;

Sie wollen

Player[] thePlayers = new Player[PlayerCount];

und

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

sollte das mit Player-Instanzen initialisierte Array zurückgeben.

BEARBEITEN:

Schauen Sie sich diese Tabelle auf Wikipedia zu Namenskonventionen für Java an, die weit verbreitet sind.

Bala R.
quelle
Wird dies nicht zu Speicherlecks führen, wenn Sie das thePlayers-Array neu initialisieren, ist dies die Schleife?
14

Wenn Sie sich über die Größe des Arrays nicht sicher sind oder sich ändern können, können Sie dies tun, um ein statisches Array zu erhalten.

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
quelle
1
Ich würde es vorziehenList<Player> thePlayersList = new ArrayList<Player>();
Deqing
2
@Deqing In diesem Fall würde ich bevorzugen Object thePlayersList = new ArrayList<Player>();.
Joel Sjögren
@Deqing Das läuft bei Überlastung tatsächlich anders.
Neel
9

Wenn Sie die Anzahl der Spieler fest codieren können

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

Arrays können nach der Initialisierung nicht mehr geändert werden. Sie müssen ihm einen Wert geben, und dieser Wert ist die Länge des Arrays. Sie können mehrere Arrays erstellen, um bestimmte Teile der Spielerinformationen wie ihre Hand und dergleichen zu enthalten, und dann eine Array-Liste erstellen, um diese Arrays zu sortieren.

Ein weiterer Streitpunkt, den ich sehe und bei dem ich mich möglicherweise irre, ist die Tatsache, dass Ihr privater Player [] InitializePlayers () statisch ist, wobei die Klasse jetzt nicht statisch ist. Damit:

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

Mein letzter Punkt wäre, dass Sie playerCount wahrscheinlich außerhalb der Methode deklarieren sollten, die es ändern wird, damit der darauf festgelegte Wert auch zum neuen Wert wird und nicht nur am Ende der Methode weggeworfen wird "Umfang."

Hoffe das hilft

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

thePlayers[i] = new Player(i); Ich habe gerade das iInnere gelöscht Player(i); und es hat funktioniert.

Die Codezeile sollte also sein:

thePlayers[i] = new Player9();
Ali Yasar Erdogan
quelle
Ich denke, das liegt daran, wie er den Spieler definiert hat. public Player(int i)Daher sollte zunächst eine ganzzahlige Eingabe erforderlich sein.
Dexhunter