2012-03-25 18 views
21

गृहकार्य: रॉक पेपर कैंची खेल। - कंप्यूटर या मानवस्ट्रिंग को एनम वैल्यू से तुलना करने का सही तरीका क्या है?

 enum Gesture{ROCK,PAPER,SCISSORS}; 

जहाँ से मैं तय करने के लिए जो जीतता है मानों की तुलना करना चाहते हैं:

मैं एक गणन बना लिया है। मूल्यों को सेट करना ठीक काम करता है, और तुलना ठीक से काम करती है (पेपर कवर रॉक, रॉक क्रश कैंची, कैंची पेपर कटौती)। हालांकि, मैं काम करने के लिए अपनी टाई नहीं मिल सकता है। किसी भी समय टाई होने पर उपयोगकर्ता को विजेता घोषित किया जाता है।

आह ... बकवास ... यह स्पष्ट होगा: userPick मूल्यों rock, paper, या scissors के साथ एक String है। userPick से computerPick की तुलना करने के लिए मैं == का उपयोग करने में असमर्थ हूं, जैसा कि आप नीचे देख सकते हैं, को enum से Gesture टाइप किया गया है।

 if(computer == 1) 
     computerPick = Gesture.ROCK; 
     else 
     if(computer == 2) 
      computerPick = Gesture.PAPER; 
     else 
      computerPick = Gesture.SCISSORS; 
     if(userPick.equals(computerPick)) 
     { 
      msg = "tie"; 
      ++tieGames; 
     } 
      etc.... 

मैं अनुमान लगा रहा हूँ वहाँ rockROCK के बराबर नहीं किया जा रहा है, या क्योंकि बाद एक String नहीं है String userPick नहीं Gesture computerPick मिलान करने में सक्षम होने के साथ एक मुद्दा है कि। हालांकि, मैं अपनी पाठ्यपुस्तक या ओरेकल के जावा ट्यूटोरियल में एक समान परिस्थिति का उदाहरण नहीं ढूंढ पा रहा हूं, इसलिए मुझे यकीन नहीं है कि समस्या को कैसे ठीक किया जाए ...

कोई संकेत?

+3

आप सही हैं, तो आप enum Gesture.ROCK को स्ट्रिंग "रॉक" तुलना नहीं कर सकते। आपको किसी प्रकार की स्ट्रिंग की आवश्यकता होगी -> इशारा मैपिंग फ़ंक्शन ताकि आप दो enums की तुलना कर सकें। सौभाग्य से, जावा पहले से ही एक प्रदान करता है। 'Gesture.valueOf ([your_string])' आज़माएं। अगर मुझे सही याद है, तो यह कार्य केस संवेदनशील है। लेकिन मुझसे गलती हो सकती है। –

+0

वह फ़ंक्शन केस संवेदनशील है। धन्यवाद! –

उत्तर

24

मैं आपके प्रश्न से एकत्र कर रहा हूं कि userPickString मान है। एक तरफ

if (userPick.equalsIgnoreCase(computerPick.name())) . . . 

एक के रूप में, अगर आप की गारंटी है कि computer हमेशा से एक मान 1, 2, या 3 (और कुछ नहीं), आप इसे एक Gesture enum करने के लिए परिवर्तित कर सकते हैं: आप इस तरह यह तुलना कर सकते हैं साथ:

Gesture computerPick = Gesture.values()[computer - 1]; 
+0

+1 स्वच्छ, और आईएमओ, मेरी टिप्पणी में मेरे विकल्प से बेहतर है। –

+0

@ टेड हॉप: लवली, प्यारा जवाब। बहुत बहुत धन्यवाद। एक फॉलोअप प्रश्न, हालांकि ... 'कंप्यूटर' के अंत में '.name' क्या करता है ~ ~ ~? मुझे लगता है कि यह ऐसा कुछ है जो 'कंप्यूटर पिक' के विशिष्ट उदाहरण को इंगित करता है? मैं यह समझने की कोशिश कर रहा हूं कि यह क्या करता है जो इसे 'if (userPick.equalsIgnoreCase (computerPick()) से अलग करता है) '। धन्यवाद! – dwwilson66

+0

@ dwwilson66 - यदि 'कंप्यूटर पिक' प्रकार 'इशारा' प्रकार का एक enum मान है, तो 'कंप्यूटर पिक()। नाम() '' कंप्यूटर' के वर्तमान मूल्य के प्रतीकात्मक नाम के साथ 'स्ट्रिंग' देता है। (यानी, यदि 'कंप्यूटर पिक == जेस्चर.रोक'' है, तो 'computerPick.name() 'स्ट्रिंग" रॉक "होगी। (प्रत्येक' enum' प्रकार में इंस्टेंस विधियों' नाम() 'और' ordinal() ' कंपाइलर द्वारा जेनरेट किया गया। इस प्रकार में स्थैतिक विधियों 'मान() 'और' valueOf (स्ट्रिंग)' स्वचालित रूप से जेनरेट किए गए हैं। [जावा भाषा विशिष्टता] देखें (http://docs.oracle.com/javase/specs/jls/ se7/html/jls-8.html # jls-8.9) –

18

आप toString() और enum में valueOf() प्रणाली की घोषणा करनी चाहिए।

import java.io.Serializable; 

public enum Gesture implements Serializable { 
    ROCK,PAPER,SCISSORS; 

    public String toString(){ 
     switch(this){ 
     case ROCK : 
      return "Rock"; 
     case PAPER : 
      return "Paper"; 
     case SCISSORS : 
      return "Scissors"; 
     } 
     return null; 
    } 

    public static Gesture valueOf(Class<Gesture> enumType, String value){ 
     if(value.equalsIgnoreCase(ROCK.toString())) 
      return Gesture.ROCK; 
     else if(value.equalsIgnoreCase(PAPER.toString())) 
      return Gesture.PAPER; 
     else if(value.equalsIgnoreCase(SCISSORS.toString())) 
      return Gesture.SCISSORS; 
     else 
      return null; 
    } 
} 
+1

यह एक महान उदाहरण है, जावा 7 में मूल्यऑफ विधि Enum में लागू की गई है। यह आपके उदाहरण के समान ही काम करता है। – Evan

+7

[जावा भाषा विशिष्टता §8.9.2 के अनुसार) ] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9।2), प्रत्येक 'enum' प्रकार की घोषणा स्वचालित रूप से एक स्थिर' valueOf (स्ट्रिंग) 'उत्पन्न करती है जो आपकी विधि की तरह व्यवहार करती है (सिवाय इसके कि यह' शून्य 'लौटने के बजाय अपवाद फेंकता है और केस संवेदनशील है)। प्रत्येक 'enum' निरंतर' Enum' विधि 'नाम()' से भी प्राप्त होता है जो आपके 'toString()' ('enum' स्थिरांक के सटीक नाम को वापस लौटाता है) के समान व्यवहार करता है। @Evan - 'valueOf'' एनम 'वर्ग का हिस्सा रहा है क्योंकि जावा में enums पेश किए गए थे; यह जावा 7 के लिए नया नहीं है। –

+0

यह उन मामलों के लिए उपयोगी है जहां enums में अंडरस्कोर होता है और आपको तुलना की आवश्यकता होती है .... निश्चित रूप से मुझे धन्यवाद देने में आपकी मदद की .... – Grim

4

आप नीचे दिए गए की तरह एक आसान तरीका में कर सकते हैं,:

boolean IsEqualStringandEnum (String str,Enum enum) 
{ 
    if (str.equals(enum.toString())) 
    return true; 
    else 
    return false; 
} 
+3

क्यों नहीं वापस str.equals (enum.toString ()) और फिर क्यों उस अभिव्यक्ति का उपयोग नहीं करते? – Dude

+0

'है' से शुरू होने वाली विधि के लिए यह पसंद किया जाता है कि यह हर समय बूलियन लौटाता है। –

0

यह साफ हो रहा है।

public enum Plane{ 

/** 
* BOEING_747 plane. 
*/ 
BOEING_747("BOEING_747"), 

/** 
* AIRBUS_A380 Plane. 
*/ 
AIRBUS_A380("AIRBUS_A380"), 

; 

private final String plane;  

private Plane(final String plane) { 
    this.plane= plane; 
} 

Plane(){ 
    plane=null; 
} 


/** 
* toString method. 
* 
* @return Value of this Enum as String. 
*/ 
@Override 
public String toString(){ 
    return plane; 
} 

/** 
* This method add support to compare Strings with the equalsIgnoreCase String method. 
* 
* Replicated functionality of the equalsIgnorecase of the java.lang.String.class 
* 
* @param value String to test. 
* @return True if equal otherwise false. 
*/ 
public boolean equalsIgnoreCase(final String value){ 
    return plane.equalsIgnoreCase(value); 
} 

और फिर मुख्य कोड में:

String airplane="BOEING_747"; 

if(Plane.BOEING_747.equalsIgnoreCase(airplane)){ 
    //code 
} 
+0

मुझे लगता है कि आप थोड़ा व्यवहार करने के लिए Enum को अधिभारित करने के लिए बहुत अधिक समय तक गए थे। –

+0

@ सल्वाडोर वेलेंसिया वास्तव में किसी ऑब्जेक्ट को अधिभारित नहीं कर रहा है ... –

-2

आप के रूप में पालन करें एक enum आइटम के लिए एक स्ट्रिंग तुलना कर सकते हैं,

सार्वजनिक वर्ग मुख्य {

enum IaaSProvider{ 
    aws, 
    microsoft, 
    google 
} 

public static void main(String[] args){ 

    IaaSProvider iaaSProvider = IaaSProvider.google; 

    if("google".equals(iaaSProvider.toString())){ 
     System.out.println("The provider is google"); 
    } 

} 

}

+0

एक स्ट्रिंग का उपयोग करने की कोशिश करने के समान बराबर तुलना में काम नहीं करेगा। भले ही यह आपको वास्तव में एक चर के लिए सेट करना चाहिए। – KHeaney

+0

स्ट्रिंग मानों का उपयोग करने में कुछ भी गलत नहीं है, शायद सुंदर नहीं है। और "google" .equals (...) कोई समस्या संकलित नहीं करता है। –

2

मेरा विचार:

public enum SomeKindOfEnum{ 
    ENUM_NAME("initialValue"); 

    private String value; 

    SomeKindOfEnum(String value){ 
     this.value = value; 
    } 

    public boolean equalValue(String passedValue){ 
     return this.value.equals(passedValue); 
    } 
} 

और यू लिख यू की जांच करने के लिए चाहते हैं:

SomeKindOfEnum.ENUM_NAME.equalValue("initialValue") 

किंडा मेरे लिए अच्छा लग रहा है :)। शायद किसी को यह उपयोगी लगेगा।

+0

यह मेरे लिए बहुत अच्छा लग रहा है। –

1

GestureTypes के एक स्थिर आयात कर रहा है और फिर इसे बहुत क्लीनर

enum GestureTypes{ROCK,PAPER,SCISSORS}; 

और

import static com.example.GestureTypes.*; 
public class GestureFactory { 

public static Gesture getInstance(final String gesture) { 
    if (ROCK == valueOf(gesture)) 
     //do somthing 
    if (PAPER == valueOf(gesture)) 
     //do somthing 
} 

}

1

परिभाषित enum लग बना सकता है valuesOf() विधि का उपयोग कर:

public enum Gesture 
{ 
    ROCK, PAPER, SCISSORS; 
} 
private boolean enumContainsValue(String value) 
{ 
    for (Gesture gesture : Gesture.values()) 
    { 
     if (gesture.name().equals(value)) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

और इसका इस्तेमाल करते हैं:एक विधि enum सामग्री की जांच करने के लिए परिभाषित

String gestureString = "PAPER"; 

if (enumContainsValue(gestureString)) 
{ 
    Gesture gestureId = Gesture.valueOf("PAPER"); 

    switch (gestureId) 
    { 
     case ROCK: 
      Log.i("TAG", "ROCK"); 
      break; 

     case PAPER: 
      Log.i("TAG", "PAPER"); 
      break; 

     case SCISSORS: 
      Log.i("TAG", "SCISSORS"); 
      break; 
    } 
} 
संबंधित मुद्दे