2013-03-19 6 views
8

मैं यह जांचने की कोशिश कर रहा हूं कि किसी शब्द में केवल I, O, S, H और X जैसे अक्षरों का एक सेट शामिल है मान लीजिए कि उपयोगकर्ता प्रवेश करता है: SSHX, आउटपुट हाँ हो सकता है लेकिन उपयोगकर्ता SHEXX दर्ज करता है तो उत्पादन नहींजांचें कि क्या स्ट्रिंग में केवल अक्षरों का एक सेट है

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word = sc.next(); 
    word = word.toUpperCase(); 

    int length = word.length(); 
    char letter = 0; 

    for (int counter = 0; counter < length; counter++) { 
     letter = word.charAt(counter); 
    } 
    if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
     System.out.print("NO"); 
    } else { 
     System.out.print("YES"); 
    } 
} 
+0

एक regex है में परिणाम के लिए सेट है सबसे आसान समाधान, लेकिन अगर आप जानना चाहते हैं कि आपका काम क्यों नहीं कर रहा है, तो ऐसा इसलिए है क्योंकि आप 'लूप' के अंदर कुछ भी परीक्षण नहीं कर रहे हैं। आप इसे अपने लिए डीबगर में देख सकते हैं। – rob

उत्तर

11

आपके पास इसे हल करने का एक अच्छा तरीका है। समस्या यह है कि आप वास्तव में प्रत्येक पत्र की जांच नहीं कर रहे हैं, इसलिए आपको लूप के अंदर चेक करने की आवश्यकता है या आप केवल अंतिम अक्षर देखेंगे। लेकिन तब आप मुद्रित नहीं कर सकते "हाँ" के रूप में आप केवल,, इस तरह के रूप में यह मुद्रित करने के लिए करता है, तो सभी पत्र हाँ कर रहे हैं ताकि आप उस की जांच करने के साथ ही एक बूलियन मान का उपयोग कर सकते हैं: के रूप में

boolean isMatch = true; 
    for (int counter = 0; counter < strLength && isMatch; counter++) { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
      System.out.print("NO"); 
      isMatch = false; 
     } 
    } 
    if (isMatch) { 
     System.out.print("YES"); 
    } 

लेकिन, दूसरों का उपयोग कर एक नियमित अभिव्यक्ति अधिक प्रभावी है ने बताया है (और यह एक तुम क्या चाहते .. तारांकन शून्य या क्या कोष्ठक के अंदर के और अधिक मतलब है के लिए एक काम regex है।):

if (word.matches("[HIOSX]*")) { 
     System.out.print("YES"); 
    } else { 
     System.out.print("NO"); 
    } 
+0

धन्यवाद @Pescis! –

2

रेगुलर एक्सप्रेशन का उपयोग हो जाएगा:

if (word.matches("[HIOSX]+")) 
    System.out.println("YES"); 
else 
    System.out.println("NO"); 
+2

आपका रेगेक्स केवल एक वर्ण की स्ट्रिंग से मेल खाता है (जो वास्तव में सूचीबद्ध लोगों में से एक होना चाहिए)। बहु-वर्ण शब्दों से मेल खाने के लिए आपको '* 'जोड़ना होगा। –

+0

धन्यवाद। असल में मिलान से खाली तारों को रोकने के लिए यह '+' होना चाहिए। – EJP

4

उपयोग एक regular expression

String regex = "[OSXHI]*"; 
String string = "SOMETHING"; 
Matcher matcher = Pattern.compile(regex).matcher(string); 
if (matcher.find()) 
{ 
    String match = matcher.group(1); 
    System.out.println(match); 
} 

कुछ अतिरिक्त संसाधन:

+0

* अन्य उत्तर से टिप्पणी चिपकाएं: * आपका रेगेक्स केवल एक वर्ण की स्ट्रिंग से मेल खाता है (जो वास्तव में सूचीबद्ध लोगों में से एक होना चाहिए)। बहु-वर्ण शब्दों से मेल खाने के लिए आपको '* 'जोड़ना होगा। –

+0

यदि आप नोटिस करेंगे, तो मैं जवाब देने वाला पहला व्यक्ति था। सलाह के लिए धन्यवाद। – syb0rg

+0

मैंने ध्यान नहीं दिया है, क्षमा करें ... "कॉपी/पेस्ट" भाग दूसरे जवाब के लिए है ... :) –

5

रेगुलर एक्सप्रेशन के उपयोग की स्पष्ट जवाब के अलावा, बनाने के लिए गूगल के अमरूद API उपयोग करने पर विचार यह सुंदर सिंप ले:

if(CharMatcher.anyOf("HIOSX").matchesAllOf(word)) { 

} ... 
+1

मुझे लगता है कि आप इसे दूसरी तरफ चाहते हैं: 'CharMatcher.anyOf ("HIOSX")। MatchAllOf (शब्द) ' –

+0

नोट किया गया, आज कोई कॉफी नहीं .. –

0

आप सभी के पहले इस तरह के पत्र को प्रारंभ करना चाहिए: char letter = '0'; के बजाय आपके सभी लूप का उपयोग बुरी तरह से किया जाता है इस कोड को आजमाएं:

boolean isInSet; 
    for (int counter = 0; counter < strLength; counter++) 
    { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') 
     { 
      isInSet=false; 
      counter=strlength; //end loop 
     } 
     else 
     { 
      isInSet=true; 
     } 
    } 
    if(isInSet=true) 
    { 
     System.out.print("YES"); 
    } 
    else 
    { 
     System.out.print("NO"); 
    } 

अब स्ट्रिंग से अधिक पाश इच्छा पाश और देखें कि क्या प्रत्येक वर्ण सेट में है, अगर यह पाश समाप्त होता नहीं है और बूलियन झूठी जो कोई उत्पादन

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