2012-05-20 19 views
5

मुझे शब्दों की संख्या गिनने की आवश्यकता है और मुझे लगता है कि ऐसा करने का सही तरीका यह है कि स्ट्रिंग में पिछले वर्ण एक अक्षर (यानी अन्य वर्ण) नहीं है क्योंकि यह मानना ​​है कि वहां स्ट्रिंग में कोलन, रिक्त स्थान, टैब और अन्य संकेत होंगे। तो पहली बार में मेरा विचार प्रत्येक चरित्र के माध्यम से लूप के लिए गया था और कितनी बार है कि आप एक वर्णमालामैं स्ट्रिंग में शब्दों की संख्या कैसे गिन सकता हूं?

for(int i = 0; i < string.length(); i++) { 
     for(int j = 0; i < alphabets.length(); j++) { 
     if (string.charAt(i-1) == alphabets.charAt(j)) { 
      counter++; 
     } 
    } 
    } 

हालांकि मैं हमेशा इस वजह से सीमा से बाहर एक सरणी मिल जाएगा का एक पत्र नहीं मिलेगा गिनती। इसलिए, मुझे थोड़ी मदद चाहिए या एक और तरीका है जो वास्तव में अधिक कुशल हो सकता है। मैंने केवल [ए-जेए-जेड] में मिलान का उपयोग करने के बारे में सोचा था, लेकिन मुझे यकीन नहीं है कि मैं कितनी बार होता है यह गिनने में एक स्ट्रिंग के तुलनीय होने के लिए एक char को कैसे संभाल सकता हूं।

धन्यवाद

+3

जावा में केवल एक शब्द है। –

+2

क्या यह होमवर्क है? –

+0

क्या यह * सभी * शब्दों की गणना है, या केवल * अद्वितीय * शब्द? –

उत्तर

2

"[ए-ज़ा-जेड]" जैसे रेगेक्स का उपयोग करने के आपके सुझाव ठीक काम करेंगे। एक स्प्लिट कमांड में, आप विपरीत पर विभाजित होंगे, जैसे:

स्ट्रिंग [] शब्द = "उदाहरण परीक्षण: एक, दो, तीन" .split ("[^ ए-ज़ा-जेड] +");

संपादित करें: यदि आप केवल कच्ची गति की तलाश में हैं, तो यह नौकरी अधिक तेज़ी से करेगा।

public static int countWords(String str) { 
    char[] sentence = str.toCharArray(); 
    boolean inWord = false; 
    int wordCt = 0; 
    for (char c : sentence) { 
     if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') { 
      if (!inWord) { 
       wordCt++; 
       inWord = true; 
      } 
     } else { 
      inWord = false; 
     } 
    } 
    return wordCt; 
} 
+0

अब तक मुझे लगता है कि उन्हें विभाजित करके एक और अधिक प्रभावी तरीका है। और मुझे लगता है कि यह मेरे लिए अगले कार्य को हल करना आसान बना देगा। इसके लिए अधिक प्रसंस्करण समय की आवश्यकता है लेकिन मुझे लगता है कि मेरे पास अब कोई दूसरा विकल्प नहीं है। – nfnmy

+0

+1 - यह वास्तव में एल्गोरिदम है जो मुझे दिमाग में था (कि आपके पास कोड है)। @ एनएफएनएम स्प्लिट दृष्टिकोण में कोने के मामले हैं जो असफल हो जाएंगे और यह धीमा भी होगा। मुझे यकीन नहीं है कि मैं समझता हूं कि आप इसका उपयोग क्यों करेंगे। – cheeken

+0

हाँ यह वास्तव में एक कुशल कोड है। लेकिन मुझे लगता है कि मैं अब स्प्लिट विधि का उपयोग करूंगा जो कि किस तरह से मेरे उद्देश्यों को सांख्यिकीय उद्देश्यों के लिए अन्य गणनाओं के लिए सरणी में छेड़छाड़ करने के मामले में आसान बनाता है। धन्यवाद फाटफिंगर्स। मैं इसे संदर्भ के लिए निश्चित रूप से रखूंगा क्योंकि मैंने पहले इस एल्गोरिदम को नहीं देखा है। चीयर्स प्रतिभा! – nfnmy

3

आप String.split() उपयोग कर सकते हैं प्रत्येक तत्व में एक शब्द के साथ एक सरणी में स्ट्रिंग परिवर्तित करने के लिए,। शब्दों की संख्या सरणी की लंबाई से दिया जाता है:

int words = myString.split("\s+").length; 
+2

गणना? सरणी में 'लंबाई' संपत्ति है। –

+0

और हो सकता है कि '\ s + 'की तरह विभाजित करने के लिए एक रेगेक्स का उपयोग करें। –

+0

इसलिए मुझे इस लंबी स्ट्रिंग को एक सरणी में विभाजित करने का प्रयास करना चाहिए, यदि चरित्र [ए-जेए-जेड] के अलावा अन्य मेल खाता है, hmmm .. – nfnmy

0
if (string.charAt(i-1) == alphabets.charAt(j)) { 
     counter++; 
    } 

आप काउंटर incrementing रहे हैं चरित्र कुछ वर्णमाला चरित्र है। यदि वर्णमाला वर्ण है तो आपको इसे बढ़ाना चाहिए।

1

आपको IndexOutOfBoundsException प्राप्त करने का कारण शायद इसलिए है क्योंकि जब मैं 0 होता हूं तो आपके आंतरिक लूप में string.charAt(i-1) होगा जो 0-1 -1 के बाद से अपवाद फेंक देगा। यदि आप ठीक करते हैं कि आपकी विधि काम कर सकती है, हालांकि आप अधिक कुशल तकनीकों का उपयोग कर सकते हैं।

1

सीधे कोड को संबोधित करते हुए अपना पहला लूप है मैं = 0 के रूप में मैं के प्रथम मान है, लेकिन फिर आप के लिए

string.charAt (i-1) पूछना = string.charAt (-1),

जहां आपकी सर-आउट-ऑफ-बाउंड आ रही है। (; मैं < alphabets.length(); J ++ इंट जे = 0) {

तुम भी अक्षर लोप विचार कर सकते हैं

के लिए

:

दूसरा पाश एक और समस्या है शब्दों के कुछ हिस्सों के रूप में भी।

+0

+1 दोनों बग्स खोजने के लिए – phatfingers

2

यह समस्या आपके एल्गोरिदम की अनुमति से थोड़ा अधिक जटिल है।

  • यदि पंक्ति में दो या दो से अधिक रिक्त स्थान हैं तो क्या होगा?
  • क्या होगा यदि स्ट्रिंग व्हाइटस्पेस (या गैर-शब्द वर्ण) के साथ शुरू होती है या समाप्त होती है?

यह होमवर्क जैसा दिखता है, इसलिए मैं कोई कोड प्रदान नहीं करना चाहता हूं। मैं एक वैकल्पिक दृष्टिकोण का सुझाव देता हूं जो सोचने के लिए आसान है।

  • स्ट्रिंग में वर्णों के माध्यम से एक-एक करके चलें।
  • अगर आप वर्तमान में किसी शब्द को स्कैन कर रहे हैं या यदि आप वर्तमान में कोई शब्द स्कैन नहीं कर रहे हैं तो याद रखने के लिए कुछ करें।
  • यह निर्धारित करने के लिए कुछ करें कि जब आप कोई शब्द दर्ज करते हैं या छोड़ते हैं, और तदनुसार अपना काउंटर बढ़ाते हैं।
+0

टिप के लिए धन्यवाद। हाँ, मैं वास्तव में किसी भी कोड की उम्मीद नहीं कर रहा हूं, बस केवल और युक्तियाँ और मैं इस समस्या से अधिक कुशलता से कैसे निपट सकता हूं। वास्तव में उत्तर के साथ चम्मच होने का आनंद लें। – nfnmy

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

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