2012-12-19 19 views
8

संभव डुप्लिकेट शामिल हैं:
Occurences of substring in a stringकितनी बार एक स्ट्रिंग एक और

जांच करने का तरीका कितनी बार एक स्ट्रिंग एक और एक में शामिल है विषय के रूप में? उदाहरण:

s1 "babab" 
s2 "bab" 
Result : 2 

तो मैं Matcher यह केवल पहला मामला पहचान करता है का उपयोग करें:

String s1 = JOptionPane.showInputDialog(" "); 
String s2 = JOptionPane.showInputDialog(" "); 
Pattern p = Pattern.compile(s2); 
Matcher m = p.matcher(s1); 
int counter = 0; 
while(m.find()){ 
    System.out.println(m.group()); 
    counter++; 
} 
System.out.println(counter); 

मुझे लगता है कि जैसे यह कर सकते हैं, लेकिन मैं उपयोग करने के लिए जावा लाइब्रेरीज iike स्कैनर, StringTokenizer नीचे चाहते हैं, Matcher आदि:

String s1 = JOptionPane.showInputDialog(" "); 
String s2 = JOptionPane.showInputDialog(" "); 
String pom; 
int count = 0; 
for(int i = 0 ; i< s1.length() ; i++){ 
    if(s1.charAt(i) == s2.charAt(0)){ 
     if(i + s2.length() <= s1.length()){ 
      pom = s1.substring(i,i+s2.length()); 
      if(pom.equals(s2)){ 
       count++; 
      } 
     } 
    } 
} 

System.out.println(count); 
+0

क्या यह एक होमवर्क असाइनमेंट है? –

+3

अंतिम मिली इंडेक्स से शुरू होने पर आप बस थोड़ी देर में 'स्ट्रिंग # इंडेक्सऑफ()' का उपयोग कर सकते हैं। – assylias

+1

http://stackoverflow.com/questions/767759/occurences-of-substring-in-a-string –

उत्तर

0

कुछ त्वरित ब्रूस फोर्ट समाधान:

String someString = "bababab"; 
    String toLookFor = "bab"; 
    int count = 0; 
    for (int i = 0; i < someString.length(); i++) { 
     if (someString.length() - i >= toLookFor.length()) { 
      if (someString.substring(i, i + toLookFor.length()).equals(toLookFor) && !"".equals(toLookFor)) { 
       count++; 
      } 
     } 
    } 
    System.out.println(count); 

यह बाहर प्रिंट 3. कृपया ध्यान दें मुझे लगता है कि String रों में से कोई भी रिक्त है।

1

कक्षा Matcher में दो विधियां हैं "start" और "end" जो अंतिम सूची की प्रारंभ सूचकांक और अंतिम अनुक्रमणिका को वापस लाती है। इसके अलावा, विधि find में एक वैकल्पिक पैरामीटर "प्रारंभ" है जिस पर यह खोजना शुरू करता है।

2

मुझे लगता है कि यह काम कर सकता है यदि आप उस शब्द को जानते हैं जो आप स्ट्रिंग में खोज रहे हैं तो आपको रेगेक्स पैटर्न को संपादित करने की आवश्यकता हो सकती है।

String string = "hellohellohellohellohellohello"; 
Pattern pattern = Pattern.compile("hello"); 
Matcher matcher = pattern.matcher(string); 
int count = 0; 
while (matcher.find()) count++; 
+0

पैटर्न 'बाबा' के साथ स्ट्रिंग 'बाबाब' के लिए '1'' के रूप में गिनती है। – mtk

+0

क्या आप इसे "बाबाबाब" के लिए चला सकते हैं और परिणाम देख सकते हैं?यदि यह दो है तो पैटर्न स्ट्रिंग के उस भाग को त्याग देते हैं जिसे पहले से ही मिला है। मुझे लगता है कि यह क्या करता है "bab-ab" एक है, इसलिए यह आपके लिए सबसे अच्छा नहीं हो सकता है .. – Drakoumel

+0

शायद यह बेहतर काम करेगा (इसे जांच लिया है और इसे नोटपैड में लिखा है इसलिए सावधान रहें: डी) स्ट्रिंग टेक्स्ट = "बाबाब"; स्ट्रिंग matchWord = "bab"; स्ट्रिंग newWord = ""; char [] chars = text.split (""); int काउंटर; के लिए (इंट जे = 0; j Drakoumel

0

आप इसे lulz

longStr के लिए इस

private int counterString(String s,String search) { 
    int times = 0; 
    int index = s.indexOf(search,0); 
    while(index > 0) { 
     index = s.indexOf(search,index+1); 
     ++times; 
    } 
    return times; 
} 
4

एक लाइनर समाधान की तरह कर सकते हैं इनपुट स्ट्रिंग है। findStr खोजने के लिए स्ट्रिंग है। longStr और findStrnull और findStr को कम से कम 1 वर्ण होना चाहिए, इसके अलावा कोई धारणा नहीं है।

longStr.length() - longStr.replaceAll(Pattern.quote(findStr.substring(0,1)) + "(?=" + Pattern.quote(findStr.substring(1)) + ")", "").length() 

2 के बाद से मेल खाता है जब तक अलग माना जाता है के रूप में वे अलग सूचकांक पर शुरू होता है, और अतिव्यापी भी हो सकता है, हम मैचों के बीच अंतर और ओवरलैप जा करने के लिए मिलान भाग के लिए अनुमति देने के लिए एक तरह से की जरूरत है।

चाल केवल खोज स्ट्रिंग के पहले अक्षर का उपभोग करने के लिए है, और शेष खोज स्ट्रिंग पर जोर देने के लिए आगे देखो। यह ओवरलैपिंग हिस्से को रीमेच करने की अनुमति देता है, और मैच के पहले अक्षर को हटाकर, हम मैचों की संख्या को गिन सकते हैं।

+0

यह कैसे काम करता है? मैं Pattern.quote विधि समझ में नहीं आता शाब्दिक regex क्या है? – MOnasz

+0

@ user1915933: इसका मतलब है कि स्ट्रिंग में वर्ण या अनुक्रम शामिल हैं जिन्हें रेगेक्स के रूप में पहचाना जा सकता है, लेकिन उन्हें सामान्य वर्णों में बेअसर कर दिया जाएगा। – nhahtdh

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