जावा में ऑब्जेक्ट की एक सरणी को इनिशियलाइज़ कैसे करें


79

मैं एक ब्लैकजैक गेम के लिए प्लेयर ऑब्जेक्ट्स की एक सरणी को इनिशियलाइज़ करना चाहता हूं। मैंने कई प्रकार के बारे में बहुत कुछ पढ़ा है, जिसमें आदिम वस्तुओं को आरोही की तरह या स्ट्रिंग की एक सरणी के रूप में देखा जा सकता है, लेकिन मैं इस अवधारणा को नहीं ले सकता कि मैं यहां क्या करने की कोशिश कर रहा हूं (नीचे देखें)। मैं आरंभिक प्लेयर ऑब्जेक्ट्स की एक सरणी वापस करना चाहूंगा। बनाने के लिए प्लेयर ऑब्जेक्ट की संख्या एक पूर्णांक है जिसके लिए मैं उपयोगकर्ता को संकेत देता हूं। मैं सोच रहा था कि कंस्ट्रक्टर किसी पूर्णांक मान को स्वीकार कर सकता है और प्लेयर के नाम को प्लेयर ऑब्जेक्ट के कुछ सदस्य वेरिएबल को इनिशियलाइज़ करते हुए तदनुसार नाम दे सकता है। मुझे लगता है कि मैं करीब हूं लेकिन अभी भी काफी उलझन में हूं।

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);
जॉन एडम्स

इस pastie.org/1865618 जैसा कुछ संकलन करना चाहिए।
बाला आर ०

जवाबों:


98

यह लगभग ठीक है। बस ले लो:

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

और लूप को दो:

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

और ध्यान दें कि जावा कन्वेंशन यह निर्धारित करता है कि विधियों और चर के नाम लोअर-केस से शुरू होने चाहिए।

अपडेट: अपनी पद्धति को क्लास बॉडी के भीतर रखें।


1
आपका यहाँ क्या मतलब है मुझे पक्का नहीं है। मेरे पास क्लास प्लेयर के अंदर कंस्ट्रक्टर है। क्या आपका मतलब है खिलाड़ी वर्ग के अंदर भी InitializePlayers डाल दिया?
जॉन एडम्स

1
@ जॉन गैल्त हाँ। यह कक्षा से बाहर नहीं हो सकता
21

@Powerlord हालांकि इसमें व्यापक रूप से उपयोग किए जाने वाले सम्मेलन शामिल हो सकते हैं और अच्छे सुझाव प्रदान कर सकते हैं, मुझे पूरा यकीन है कि उस दस्तावेज़ के आधे आइटम इस तरह से वास्तव में सम्मेलनों के लिए बहुत अस्पष्ट हैं।
twiz

@Wiz निष्पक्ष होने के लिए, वह दस्तावेज़ प्रोग्रामिंग कन्वेंशन है Oracle né Sun का अपना डेवलपर्स उपयोग है। मैं OpenJDK के कोड के माध्यम से नहीं देखा है कि वे कितनी अच्छी तरह से पालन किए गए थे।
पॉवरलॉर्ड


23

के बजाय

Player[PlayerCount] thePlayers;

तुम्हें चाहिए

Player[] thePlayers = new Player[PlayerCount];

तथा

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

प्लेयर इंस्टेंस के साथ आरंभीकृत सरणी को वापस करना चाहिए।

संपादित करें:

बाहर की जाँच करें विकिपीडिया पर इस तालिका जावा के लिए सम्मेलनों की जाती है कि व्यापक रूप से इस्तेमाल के नामकरण पर।


क्या यह मेमोरी लीक्स तब नहीं बनेगा जब आपके री-इनिशियलाइज़ 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>();
Deqing

2
@Deqing उस मामले में मैं पसंद करेंगे Object thePlayersList = new ArrayList<Player>();
जोएल सोजग्रीन

@Deqing वास्तव में ओवरलोडिंग के मामले में अलग तरह से चलेगी।
नील

9

यदि आप खिलाड़ियों की संख्या को हार्ड-कोड कर सकते हैं

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

1

आरंभीकरण आरंभ होने के बाद परिवर्तनशील नहीं हैं। आपको इसे एक मूल्य देना होगा, और यह मान वह है जो सरणी लंबाई रहता है। आप अपने हाथ और जैसे खिलाड़ी जानकारी के कुछ हिस्सों को शामिल करने के लिए कई सरणियाँ बना सकते हैं, और फिर उन सरणियों को क्रमबद्ध करने के लिए एक सरणी बनाएँ।

विवाद का एक और बिंदु जो मैं देख रहा हूं, और मैं इस बारे में गलत हो सकता हूं, यह तथ्य है कि आपका निजी प्लेयर [] InitializePlayers () स्थिर है जहां वर्ग अब गैर-स्थिर है। इसलिए:

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

मेरा अंतिम बिंदु यह होगा कि आपके पास संभवत: प्लेयरकाउंट घोषित होना चाहिए जो उस विधि के बाहर है जो इसे बदलने जा रहा है ताकि इसके लिए जो मूल्य निर्धारित किया गया है वह नया मूल्य भी बन जाए और यह विधि के अंत में फेंक दिया जाए, ऐसा नहीं है "गुंजाइश।"

उम्मीद है की यह मदद करेगा



0

thePlayers[i] = new Player(i); मैंने बस iअंदर ही मिटा दिया Player(i); और यह काम किया।

इसलिए कोड लाइन होनी चाहिए:

thePlayers[i] = new Player9();

मुझे लगता है कि यह इसलिए है क्योंकि जिस तरह से उन्होंने खिलाड़ी को परिभाषित किया है, public Player(int i)इसलिए उसे शुरू में एक पूर्णांक इनपुट लेना चाहिए।
डेक्सहंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.