2012-06-14 17 views
5

मेरे ऐप में, अगर इनपुट कुछ विशिष्ट 20 प्रविष्टियों से मेल खाता है तो मुझे शाखा बनाने की आवश्यकता है।जटिल अगर() या enum?

मैं एक समारोह करने के लिए

switch(dateRule.valueOf(input)) 
{ 
    case is_on : 
    case is_not_on : 
    case is_before : 
    . 
    . 
    . 
    // function() 
    break; 
} 

लेकिन इनपुट तार हो जाएगा की तरह 'पर है', 'नहीं है एक enum

public enum dateRule { is_on, is_not_on, is_before,...} 

और enum निरंतर पर एक स्विच का उपयोग के बारे में सोचा ',' शब्दों के बीच _ के बिना 'पहले' है। मैंने सीखा कि एक enum अंतरिक्ष युक्त स्थिरांक नहीं हो सकता है। शब्दों के बीच

1, का उपयोग करता है, तो बयान 20 संभव आदानों कि इनपुट पर एक लंबे अगर बयान की तरह

if(input.equals("is on") || 
    input.equals("is not on") || 
    input.equals("is before") ...) { // function() } 

2, काम दे रही है सम्मिलित करने के लिए तुलना करने के लिए _:

संभव तरीके मैं बाहर कर सकता है लेकिन यहां तक ​​कि अन्य इनपुट स्ट्रिंग्स जो इस 20 के तहत नहीं आती हैं, उनमें कई शब्द हो सकते हैं।

क्या इसे लागू करने का कोई बेहतर तरीका है?

+0

जावा 7 में आप एक स्ट्रिंग पर बदल सकते हैं। –

उत्तर

0

सुझावों के लिए धन्यवाद। उन्होंने मुझे यहां निर्देशित किया।

यह लगभग अन्य उत्तरों के समान ही है, बस थोड़ा सा सरल है।

संक्षेप में, मैं 20 तार और

अगर वे से मेल खाते हैं, कुछ करने का एक सेट के साथ इनपुट स्ट्रिंग तुलना करने के लिए की जरूरत है। अन्यथा, कुछ और करो।

तार के स्टेटिक सेट इनपुट तुलना करने की जरूरत है जो करने के लिए: पर है, पर नहीं है इससे पहले कि है, के बाद है, आदि 20 प्रविष्टियों

मैं एक enum

public enum dateRules 
{ 
    is_on 
    ,is_not_on 
    ,is_before 
    ,is_after 
    . 
    . 
    . 
} 

और स्विचिंग बनाया इनपुट

if(isARule(in = input.replace(" ","_")) 
{ 
    switch(dateRule.valueOf(in)) 
    { 
     case is_on, 
     case is_not_on, 
     case is_before, ... 
    } 
} 

की स्वरूपित मूल्य पर मैं 'में' करने के लिए 'इनपुट' की प्रारूपित मान की नकल की 'के साथ' '_' की जगह ले ताकि मैं एक और बिना इनपुट का पुन: उपयोग कर सकते हैं।

private static boolean isARule(String value) 
    { 
    for(dateRule rule : dateRule.values()) 
    { 
     if(rule.toString().equals(value)) 
     { 
     return true; 
     } 
    } 
    return false; 
    } 

समस्या हल हो गई।

संदर्भ: https://stackoverflow.com/a/4936895/1297564

1

आप जावा 7 का उपयोग कर रहे हैं, तो आप भी बीच सड़क यहां चुन सकते हैं, और तार के साथ एक switch बयान करते हैं:, दोनों समाधान कर रहे हैं

switch (input) { 
    case "is on": 
     // do stuff 
     break; 
    case "is not on": 
     // etc 
} 
+3

जावा 7+ के साथ केवल –

+0

जानकारी के लिए धन्यवाद। निश्चित रूप से भविष्य में मुझे कुछ समय में मदद मिलेगी। :) – aradhak

0

आप वास्तव में ऊपर पर्याप्त अवधारणा को तोड़ने नहीं कर रहे हैं भंगुर ...

अपने वाक्य रचना

पर देखो, हटा सकते हैं,

"नहीं", वैकल्पिक, एक लागू सर्वव्यापी हो रहा है "है"! उत्पादन तुलना

तुलना में, पहले, बाद में, तुलना लागू करें।

तो रिक्त स्थान के बीच एक विभाजन करें। यह सुनिश्चित करने के लिए विभाजित शब्दों को पार्स करें कि वे वाक्यविन्यास परिभाषा में मौजूद हैं और फिर पारित अभिव्यक्ति का चरण-दर-चरण मूल्यांकन करते हैं। इससे आपको वाक्यविन्यास को आसानी से विस्तारित करने की अनुमति मिल जाएगी (बिना "है" और " "प्रत्येक संयोजन के लिए और अपने कोड को पढ़ने के लिए आसान स्विच बयान के प्रयोजनों के लिए एक में munged अनेक शर्तों के बाद रहते हैं।

समय के साथ बहुत बड़ा ब्लोट की ओर जाता है।

3

यह मूल्य से enum पहचानकर्ता अलग करने के लिए संभव है कुछ इस तरह:

public enum MyEnumType 
{ 
    IS_BEFORE("is before"), 
    IS_ON("is on"), 
    IS_NOT_ON("is not on") 

    public final String value; 

    MyEnumType(final String value) 
    { 
     this.value = value; 
    } 
} 

आप enum-type में विधियां भी जोड़ सकते हैं (विधि में तर्क हो सकता है पिता के रूप में अच्छी तरह से), कुछ इस तरह:

स्विच में
public boolean isOnOrNotOn() 
{ 
    return (this.value.contentEquals(IS_ON) || this.value.contentEquals(IS_NOT_ON)); 
} 

उपयोग:

switch(dateRule.valueOf(input)) 
{ 
    case IS_ON: ... 
    case IS_NOT_ON: ... 
    case IS_BEFORE: ... 
} 

और जब आप उदाहरण System.out.println(IS_ON) के लिए की तरह IS_ON का मूल्य प्राप्त यह is on दिखाएगा।

+0

मुझे तारीख में दिनांक 'dateRule() त्रुटि मिलती है नियम (java.lang.String) पर लागू नहीं किया जा सकता है। आईडीई सुझाव एक निर्माता को परिभाषित करना है। – aradhak

+0

@ स्टूडेंट तो यह मेरा सुझाव भी है :) इसके बारे में क्षमा करें, मैंने केवल आंशिक कोड पोस्ट किया है। मैंने अभी कुछ और जोड़ा है। –

+0

धन्यवाद! अब और कोई त्रुटि नहीं है। :) लेकिन मुझे 'System.out.println (is_on) पर is_on मिलता है; ' – aradhak

3

आप enum के अंदर valueOf विधि के अपने संस्करण को परिभाषित कर सकते हैं (बस इसे valueOf पर कॉल न करें)।

public enum State { 
    IS_ON, 
    IS_OFF; 

    public static State translate(String value) { 
     return valueOf(value.toUpperCase().replace(' ', '_')); 
    } 
} 

बस इसे पहले की तरह उपयोग करें।

State state = State.translate("is on"); 

पहले स्विच स्टेटमेंट अभी भी काम करेगा।

+0

यहां से शुरू किए गए समाधान में समाप्त होने वाले नियंत्रण प्रवाह को समाप्त करने और आगे सरल बनाने पर शुरू किया गया। बहुत कुछ सीख लिया। धन्यवाद। :) – aradhak

संबंधित मुद्दे