2011-09-30 3 views
36

में एकाधिक 'या' शर्तों को प्रारूपित करने का सबसे अच्छा तरीका एक साधारण सवाल है लेकिन Google बहुत मदद नहीं कर रहा है।अगर किसी कथन (जावा)

मैं कई शर्तों के साथ एक अगर बयान है इसके बजाय की तरह कुछ लिखने की (10 या 15 स्थिरांक के लिए जाँच करने के लिए अगर उनमें से किसी मौजूद हैं देखने के लिए है।)

:

if (x == 12 || x == 16 || x == 19 || ...) 

है जैसे

if x is [12, 16, 19]? 

बस सोच अगर वहाँ इस कोड करने के लिए एक आसान तरीका है यह फ़ॉर्मेट करने के लिए किसी भी तरह से, किसी भी मदद की सराहना की।

संपादित करें: उत्तर बहुत उपयोगी रहे हैं, लेकिन मुझे कुछ लोगों द्वारा अधिक जानकारी जोड़ने के लिए कहा गया था, इसलिए मैं उनकी जिज्ञासा को तृप्त करने के लिए ऐसा करूंगा। मैं एक तारीख सत्यापन कक्षा बना रहा था जिसके लिए यह सुनिश्चित करने के लिए आवश्यक था कि 30 दिनों के दिनों में 30 दिनों (जिनमें से 4 हैं, मुझे लगता है) और मैं इस तरह की चीजों की जांच करने के लिए एक कथन कथन लिख रहा था:

if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11)) 

मैं बस सोच रहा था कि इस तरह की चीजों को कोड करने का एक तेज़ तरीका था - नीचे दिए गए कई उत्तरों में मदद मिली है :)।

+0

क्या आप अपनी कोशिश करने का प्रयास कर सकते हैं? शायद इसके बारे में सोचने में एक समाधान है? –

उत्तर

37

मैं अक्सर पैटर्न के इस प्रकार का उपयोग करें। यह बहुत ही कॉम्पैक्ट है:

// Define a constant in your class. Use a HashSet for performance 
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19)); 

// In your method: 
if (values.contains(x)) { 
    ... 
} 

एक HashSet यहाँ प्रयोग किया जाता है अच्छा लुक-अप प्रदर्शन देने के लिए - यहां तक ​​कि बहुत बड़ी हैश सेट बहुत जल्दी निष्पादित करने में सक्षम हैं।

यदि प्रदर्शन महत्वपूर्ण नहीं है, तो आप एक लाइन में यह का सार कोड कर सकते हैं:

if (Arrays.asList(12, 16, 19).contains(x)) 

लेकिन पता है कि यह एक नया ArrayList हर बार यह कार्यान्वित पैदा करेगा।

+2

अगर (Arrays.asList (12, 16, 19) .contains (x)) –

+0

ब्रायन, मैंने एक प्रदर्शन चेतावनी – Bohemian

+1

के साथ अपना सुझाव जोड़ा है, इसके बजाय मैं इसके लिए 'सूची' की तुलना में 'सेट' का उपयोग करूंगा, लेकिन इसका वास्तव में उन कुछ तत्वों पर कोई प्रभाव नहीं पड़ेगा। –

3

आप मानचित्र कुंजी की उपस्थिति की तलाश कर सकते हैं या देख सकते हैं कि यह एक सेट में है या नहीं। इस कोड को अधिक पठनीय बनाने के लिए और सभी दूर छिपाने जाएगा -

क्या आप वास्तव में कर रहे हैं पर निर्भर करता है, हालांकि, आप इस समस्या को गलत :)

3

उपयोग किसी प्रकार का एक संग्रह को सुलझाने की कोशिश की जा सकती है उन स्थिरांक। एक आसान तरीका एक सूची के साथ होगा: स्थिरांक की सूची बोहेमियन अंक तो यह और अधिक से अधिक एक ही स्थान पर पहुंचा जा सकता है स्थिर हो सकता है

// Declared with constants 
private static List<Integer> myConstants = new ArrayList<Integer>(){{ 
    add(12); 
    add(16); 
    add(19); 
}}; 

// Wherever you are checking for presence of the constant 
if(myConstants.contains(x)){ 
    // ETC 
} 

के रूप में।

रुचि रखने वालों के लिए, मेरे उदाहरण में सूची double brace initialization का उपयोग कर रही है। चूंकि मैंने हाल ही में इसमें भाग लिया है, इसलिए मुझे जल्दी & गंदे सूची प्रारंभिक लेखन के लिए अच्छा लगा है।

+1

या 'अगर (Arrays.asList (नई पूर्णांक [] {12,16,19})। शामिल (x)) {...}' –

+0

@Bala सुनिश्चित करें! किसी भी मामले में एक सूची यहां उपयोग करने के लिए संग्रह का एक उदाहरण है। चूंकि अन्य उत्तरों में से एक सुझाव दिया गया है कि एक सेट बेहतर हो सकता है कि स्थिरांक अद्वितीय हैं ... या एक हैश टेबल तेज दिखने के लिए इत्यादि। –

10

क्या आप इस पर स्विच करना चाहते हैं ??

switch(x) { 
    case 12: 
    case 16: 
    case 19: 
     //Do something 
     break; 
    default: 
     //Do nothing or something else.. 
     break; 
} 
3

संभावनाओं के सेट "कॉम्पैक्ट" है - आप एक लुकअप तालिका पर विचार हो सकता है (यानी सबसे बड़े मूल्य छोटी से छोटी-मूल्य 200 से भी कम है कहते हैं,)। यदि आप

if (x == 12 || x == 16 || x == 19 || ...) 
else if (x==34 || x == 55 || ...) 
else if (...) 

मूल्यों शाखा की पहचान करने के साथ एक सरणी सेट अप की तरह एक संरचना था लिया जाना (1, ऊपर के उदाहरण में 2, 3) और यह विशेष रूप से उपयोगी होगा तो अपने परीक्षण बन

switch(dispatchTable[x]) 
{ 
    case 1: 
     ... 
     break; 
    case 2: 
     ... 
     break; 
    case 3: 
     ... 
     break; 
} 

चाहे यह उचित है या नहीं, समस्या के अर्थशास्त्र पर निर्भर करता है।

एक सरणी उपयुक्त नहीं है, तो आप एक Map<Integer,Integer> इस्तेमाल कर सकते हैं, या आप बस एक ही बयान के लिए सदस्यता का परीक्षण करना चाहते हैं, एक Set<Integer> करना होगा।यह एक सरल if कथन के लिए बहुत अधिक अग्निशक्ति है, हालांकि, बिना किसी संदर्भ के सही दिशा में आपको मार्गदर्शन करना मुश्किल है।

4

नहीं, तुम ऐसा नहीं कर सकते कि जावा में।

boolean isContains(int i, int ... numbers) { 
    // code to check if i is one of the numbers 
    for (int n : numbers) { 
     if (i == n) return true; 
    } 
    return false; 
} 
2

जावा 8 के साथ, आप एक आदिम धारा इस्तेमाल कर सकते हैं: इस प्रकार आप फिर भी एक विधि लिख सकते हैं

if (IntStream.of(12, 16, 19).anyMatch(i -> i == x)) 

लेकिन यह एक मामूली भूमि के ऊपर हो सकता है (या नहीं), संख्या के आधार पर तुलना की।