2011-12-29 26 views
5

परिदृश्य:
मैं मानक डेक में सभी बजाने वाले कार्ड युक्त एक enum रखना चाहता हूं। इस उदाहरण के लिए जोकरों को अनदेखा करें।लूप

लेखन

enum Cards { 
    SPADE_1(0, 1), 
    SPADE_2(0, 2), 
    etc. 

गलत लगता है।

मैं इस

enum Card { 
    for (int suit=0; suit<4; suit++) { 
     for (int face=1; face<13; face++) { 
      new Card(suit, face); 
     } 
    } 
} 

मैं एक वर्ग सूट और चेहरे क्षेत्रों, जहां सूट और चेहरे खुद को enums हैं युक्त के रूप में कार्ड को परिभाषित करने पर विचार किया है की तरह कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं। हालांकि अन्य परिदृश्यों में (जैसे कि जूतों के पास लाल और काले सूट होते हैं) इससे अमान्य कार्ड ऑब्जेक्ट्स बनने की अनुमति मिलती है (यानी हीरे का जोकर, या लाल 10)।

स्व-उत्तर:
स्पष्ट रूप से मेरे पास अपने प्रश्न का उत्तर पोस्ट करने के लिए पर्याप्त प्रतिनिधि नहीं है।

 
I'm not sure if it's considered good form to answer my own question, but @Paul just gave me a brainwave. 

Declare Card to have a private constructor, and use a 
    static Card getCard(suit, face) 
method to validate combinations before returning them. 
+3

शायद एक 'enum' आप जो चाहते हैं वह नहीं है। क्या आपको वास्तव में क्लबों के 3 क्लबों को CLUBS_3 के रूप में संदर्भित करने की आवश्यकता है? – Paul

+0

हां, बिल्कुल - निजी कन्स्ट्रक्टर, एसयूआईटी और फेस के लिए अलग-अलग enums। –

उत्तर

1

मुझे नहीं लगता कि यह enum का उपयोग किया जा सकता है, लेकिन हम कर सकते हैं implementenum रूप class। आप नीचे कुछ ऐसा कर सकते हैं।

क्रियान्वयन:

public class Card { 
    private int suit; 
    private int face; 

    private Card(int suit, int face){ 
     this.suit = suit; 
     this.face = face; 
    } 

    public int getSuit(){ 
     return this.suit; 
    } 
    public int getFace(){ 
     return this.face; 
    } 
    public static Card[] cards = new Card[52]; 

     static{ 
     int counter =0; 
     for (int i=0; i<4; i++) { 
      for (int j=0; j<13; j++) { 
       cards[counter] = new Card(i, j); 
       counter++; 
      } 
     } 
     } 
} 

संपादित करें: कार्ड के counter निर्धारित किया है। इससे पहले यह सूचकांक के लिए NullPointerException फेंक से अधिक 15.

USAGES:

System.out.println("face of the card:"+Card.cards[10].getFace()); 
System.out.println("suit of the card:"+Card.cards[10].getSuit()); 

उत्पादन:

face of the card:7 
suit of the card:3 
+0

मैं सूट और चेहरे के लिए enums का उपयोग करता हूं, लेकिन मुझे लगता है कि एक पठन (चेहरा, सूट) विधि के साथ संयुक्त सार्वजनिक पढ़ने-योग्य संग्रह जाने का सही तरीका है। –

+0

आप इसे किसी भी तरह से कर सकते हैं (कार्ड के लिए एनम या सादे वर्ग का उपयोग करके) विधि देखें: सार्वजनिक स्थैतिक कार्ड उदाहरण (रैंक रैंक, सूट सूट) ... http://stackoverflow.com/questions/8626670/java- enum-or-encoding-with-numbers/8627079 # 8627079 –

0

मैं दो enums बनाने कहेंगे: प्रत्येक चेहरे के लिए, और प्रत्येक कार्ड के लिए दूसरा एक। तो कार्ड एनम में, प्रत्येक enum की दो संपत्ति होती है: कार्ड की संख्या (यदि आप इस उद्देश्य के लिए सादे संख्याओं का उपयोग नहीं करते हैं तो आप अभी तक एक और enum बना सकते हैं), और चेहरे जो चेहरे की enum का एक उदाहरण है। इससे समस्या का समाधान होना चाहिए।

+0

मुझे अभी भी सभी 52 कार्ड्स मैन्युअल रूप से गिनना होगा, जो मैं बचने की कोशिश कर रहा हूं। मैं आसान समझ आदि के लिए स्रोत की मात्रा को कम करना चाहता हूं। –

0

मैंने रैंक, सूट और कार्ड के लिए एक enum का उपयोग किया जो काफी अच्छी तरह से काम करने लग रहा था। कोड के लिए यह उत्तर देखें: Java: Enum or encoding with numbers?

+0

आपके द्वारा लिंक किए गए उंगली-चोट का टॉम बिल्कुल ठीक है जिसे मैं टालने की कोशिश कर रहा हूं –