স্ট্রিংয়ে সাবস্ট্রিংয়ের ঘটনা


122

নীচের অ্যালগরিদমটি আমার জন্য কেন থামছে না? (স্ট্রিংটি আমি অনুসন্ধান করছি এমন স্ট্রিং, ফাইন্ডএসআরটি হ'ল স্ট্রিংটি আমি সন্ধান করার চেষ্টা করছি)

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while (lastIndex != -1) {
    lastIndex = str.indexOf(findStr,lastIndex);

    if( lastIndex != -1)
        count++;

    lastIndex += findStr.length();
}

System.out.println(count);

8
উদাসেতাতে আমরা সত্যিই একটি ভাল কাজ করেছি: আমরা নিউএসটিআরএস = স্ট্রিংরেপ্লেস (ফাইন্ডএসটিআর, "") ব্যবহার করেছি; এবং প্রত্যাবর্তিত গণনা = ((স্ট্রাইলেথেন্থ () - নতুনএসআর.লাইনেথ ()) / FindStr.leth ());
সোলারলুনিক্স

অক্ষরের জন্য একই প্রশ্ন: stackoverflow.com/q/275944/873282
koppor

আপনি কি সেই মামলার জন্য অ্যাকাউন্ট করতে চান না যেখানে অনুসন্ধান স্ট্রিংয়ের উপসর্গটি তার প্রত্যয়? সেক্ষেত্রে আমি মনে করি না প্রস্তাবিত উত্তরগুলির কোনও কাজ করবে। এখানে একটি উদাহরণ। সেক্ষেত্রে আপনার আরও একটি বিস্তৃত অ্যালগরিদম প্রয়োজন হবে, যেমন নথ মরিস প্র্যাট (কেএমপি) যা সিএলআরএস বইতে কোডড হয়েছে
সিড

এটি আপনার জন্য থামছে না, কারণ আপনার 'থামানো' শর্তটি পৌঁছে যাওয়ার পরে (সর্বশেষ সূচক == -1) আপনি লাস্ট ইন্ডেক্সের মান বাড়িয়ে এটি পুনরায় সেট করেছেন (সর্বশেষ তালিকা + = সন্ধানের দৈর্ঘ্য ();)
লেগনা

উত্তর:


83

শেষ লাইনটি একটি সমস্যা তৈরি করছিল। lastIndex-1 এ কখনও হবে না, সুতরাং একটি অসীম লুপ থাকবে। কোডের শেষ লাইনটিকে if ব্লকে স্থানান্তর করে এটি স্থির করা যেতে পারে।

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while(lastIndex != -1){

    lastIndex = str.indexOf(findStr,lastIndex);

    if(lastIndex != -1){
        count ++;
        lastIndex += findStr.length();
    }
}
System.out.println(count);

121
এই উত্তরটি আমি এক ঘন্টা আগে তৈরি পোস্টটির সঠিক অনুলিপি;)
অলিভিয়ার

8
মনে রাখবেন যে এটি প্রত্যাশিত ফলাফলটি দিতে বা নাও পারে। "এএ" এর স্ট্রিং এবং "এএএ" অনুসন্ধানের স্ট্রিংয়ের সাথে প্রত্যাশিত সংখ্যার সংখ্যা এক হতে পারে (এই কোডটি দিয়ে ফিরে এসেছে) তবে দুটিও হতে পারে (এক্ষেত্রে আপনার "লাস্ট ইন্ডেক্স ++" এর পরিবর্তে "লাস্ট ইনডেক্স ++" প্রয়োজন হবে you'll আপনি যা খুঁজছেন তার উপর নির্ভর করে FindStr.length () ")।
স্টানিস্লাভ নিয়াজেভ

@ অলিভার এটি দেখতে পেলেন না ... :( @ এটি একেবারে সঠিক হয়েছে ... আমি সমস্যাটিতে কোডটি ঠিক করছিলাম ... অনুমান করুন যে এটি স্ট্রিংয়ের সংখ্যার দ্বারা ববকমের অর্থ কী তার উপর নির্ভর করে ...
কোডব্র্যাচ

1
লোকেরা কবে কপি এবং স্ট্যাটিক পদ্ধতিতে এই জাতীয় জিনিসপত্র মোড়ানো শিখবে? নীচে আমার উত্তর দেখুন, এটি আরও অনুকূলিত।
মিমি

1
এখানে নৈতিকতাটি হ'ল আপনি যদি উত্তর লেখার ইচ্ছা পোষণ করেন তবে ইতিমধ্যে অন্য কেউ ঠিক একই উত্তর লিখেছেন কি না তা আগে পরীক্ষা করুন । আপনার উত্তর অনুলিপি করা হয়েছে, বা স্বতঃ লিখিত হয়েছে তা নির্বিশেষে একই উত্তর দু'বার প্রদর্শিত হওয়ার সত্যিই কোনও লাভ নেই।
দাউদ ইবনে করিম

192

অ্যাপাচি কমন্স ল্যাং থেকে স্ট্রিংইটিলস.কাউন্টম্যাচগুলি কীভাবে ব্যবহার করবেন ?

String str = "helloslkhellodjladfjhello";
String findStr = "hello";

System.out.println(StringUtils.countMatches(str, findStr));

ফলাফল:

3

9
এই পরামর্শটি যতই সঠিক হোক না কেন, এটি ওপি-র প্রশ্নের উত্তর দিচ্ছে না কারণ এটি সমাধান হিসাবে মেনে নেওয়া যায় না
kommradHomer

3
এটি কি অবহেলিত বা অন্য কিছু .. আমার আইডিই স্বীকৃতি
দিচ্ছে

@ ভামসিপাভানমাহেশ স্ট্রিংউটিলস অ্যাপাচি কমন্সের একটি গ্রন্থাগার। এখানে চেক করুন: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
অনুপ

এই উত্তরটি হ'ল একদিন আগে পিটার লরির উত্তরের একটি অনুলিপি (নীচে দেখুন)।
জোন

StringUtilsনেই countMatchesপদ্ধতি।
plaidshirt

117

আপনার lastIndex += findStr.length();ব্র্যাকেটের বাইরে রাখা হয়েছিল, একটি অসীম লুপ তৈরি করে (যখন কোনও ঘটনা খুঁজে পাওয়া যায় নি, সর্বশেষ তালিকাটি সর্বদা ছিল findStr.length())।

এখানে স্থির সংস্করণটি রয়েছে:

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while (lastIndex != -1) {

    lastIndex = str.indexOf(findStr, lastIndex);

    if (lastIndex != -1) {
        count++;
        lastIndex += findStr.length();
    }
}
System.out.println(count);

92

একটি সংক্ষিপ্ত সংস্করণ। ;)

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
System.out.println(str.split(findStr, -1).length-1);

8
return haystack.split(Pattern.quote(needle), -1).length - 1;উদাহরণস্বরূপneedle=":)"
Mr_and_Mrs_D

2
@ লরঞ্জার ছাড়া ,-1এটি পেছনের ম্যাচগুলি ফেলে দেবে।
পিটার লরি

3
ওহ, ধন্যবাদ, জানা ভাল! এটি আমাকে জাভাদোকের ছোট লাইনগুলি পড়তে শেখাবে ...
লরেন্ট

4
নিস! তবে এটিতে কেবল নন-ওভারল্যাপিং ম্যাচগুলি অন্তর্ভুক্ত রয়েছে, না? উদাহরণস্বরূপ "আ" এর সাথে "আ" মিলবে কি 2 হবে না? অবশ্যই ওভারল্যাপিং বা নন-ওভারল্যাপিং মিলগুলি উভয়ই বৈধ এবং ব্যবহারকারীর প্রয়োজনীয়তার উপর নির্ভরশীল (সম্ভবত একটি সংখ্যার ওভারল্যাপগুলি গণনা করার জন্য পতাকা, হ্যাঁ / না)?
কর্নেল ম্যাসন

2
-1 .. এটি "আআআ" এবং "এএ" এ চালানোর চেষ্টা করুন .. সঠিক উত্তরটি 3 নয় 2
কল্যাণরমণ সন্তনাম

79

আপনি কি সত্যিই নিজেকে ম্যাচিং পরিচালনা করতে হবে? বিশেষত আপনার যা প্রয়োজন তা হ'ল সংখ্যার সংখ্যা, নিয়মিত প্রকাশগুলি আরও পরিশ্রমী:

String str = "helloslkhellodjladfjhello";
Pattern p = Pattern.compile("hello");
Matcher m = p.matcher(str);
int count = 0;
while (m.find()){
    count +=1;
}
System.out.println(count);     

1
এটি বিশেষ অক্ষরগুলি খুঁজে পাচ্ছে না, এটি নীচের স্ট্রিংগুলির জন্য 0 গণনা খুঁজে পাবেন:String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
বেন

13
হ্যাঁ এটি যদি আপনি সঠিকভাবে আপনার রেজেক্সটি প্রকাশ করেন। দিয়ে চেষ্টা চিহ্ন একটি Regex এবং চাহিদা একটি বিশেষ অর্থ পলান করতে হবে। Pattern.compile("hel\\+lo");+
জিন

4
আপনি যা সন্ধান করছেন তা যদি একটি স্বেচ্ছাচারী স্ট্রিং নেওয়া হয় এবং এটিকে সমস্ত বিশেষ নিয়মিত অভিব্যক্তির অক্ষর উপেক্ষা করে হুবহু মিল হিসাবে ব্যবহার করা হয় তবে Pattern.quote(str)কি আপনার বন্ধু!
মাইক ফুরতাক

2
str = "aaaaaa" হলে এটি "আআ" এর পক্ষে কাজ করে না। 4 টি উত্তর রয়েছে তবে আপনার দেওয়া 2
পুজান শ্রীবাস্তব

এই সমাধানটি এই ক্ষেত্রে কাজ করে না: str = "এটি একটি পরীক্ষা \\ n \\ r স্ট্রিং", সাবএসটিআর = "\\ r", এটি 0 টি ঘটনা দেখায়।
ম্যাকসেম ওভসিয়ানিকভ

19

আমি খুব অবাক হয়েছি কেউ এই ওয়ান লাইনের কথা উল্লেখ করেনি। এটি সাধারণ, সংক্ষিপ্ত এবং এর চেয়ে কিছুটা ভাল সম্পাদন করেstr.split(target, -1).length-1

public static int count(String str, String target) {
    return (str.length() - str.replace(target, "").length()) / target.length();
}

শীর্ষ উত্তর হওয়া উচিত। ধন্যবাদ!
lakam99

12

এটি এখানে, একটি দুর্দান্ত এবং পুনরায় ব্যবহারযোগ্য পদ্ধতিতে মোড়ানো:

public static int count(String text, String find) {
        int index = 0, count = 0, length = find.length();
        while( (index = text.indexOf(find, index)) != -1 ) {                
                index += length; count++;
        }
        return count;
}

8
String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) {
     count++;
     lastIndex += findStr.length() - 1;
}
System.out.println(count);

লুপের গণনা শেষে 3; আশা করি এটা সাহায্য করবে


5
কোডটিতে একটি ত্রুটি রয়েছে। আমরা যদি একটি একক চরিত্রের জন্য অনুসন্ধান করি তবে findStr.length() - 10 প্রদান করে এবং আমরা একটি অন্তহীন চক্রে।
জান বোদনার

6

প্রদত্ত অনেকগুলি উত্তর এক বা একাধিকটিতে ব্যর্থ হয়:

  • স্বেচ্ছাসেবী দৈর্ঘ্যের প্যাটার্নস
  • ওভারল্যাপিং মিলগুলি (যেমন "23232" "232" গণনা বা "আআ" তে "আ" গণনা করা)
  • নিয়মিত অভিব্যক্তি মেটা-অক্ষর

আমি যা লিখেছি তা এখানে:

static int countMatches(Pattern pattern, String string)
{
    Matcher matcher = pattern.matcher(string);

    int count = 0;
    int pos = 0;
    while (matcher.find(pos))
    {
        count++;
        pos = matcher.start() + 1;
    }

    return count;
}

উদাহরণ কল:

Pattern pattern = Pattern.compile("232");
int count = countMatches(pattern, "23232"); // Returns 2

আপনি যদি নিয়মিত-বহিঃপ্রকাশের অনুসন্ধান চান, তবে LITERALপতাকাটি দিয়ে আপনার প্যাটার্নটি যথাযথভাবে সংকলন করুন :

Pattern pattern = Pattern.compile("1+1", Pattern.LITERAL);
int count = countMatches(pattern, "1+1+1"); // Returns 2

হ্যাঁ ... অবাক করে দিয়ে অ্যাপাচি স্ট্রিং ইউটিলসে এর মতো কিছু নেই।
মাইকে রডেন্ট

6
public int countOfOccurrences(String str, String subStr) {
  return (str.length() - str.replaceAll(Pattern.quote(subStr), "").length()) / subStr.length();
}

ভাল উত্তর. কীভাবে এটি কাজ করে তাতে কিছু নোট যুক্ত করতে আপত্তি করতে পারেন?
সন্তোষ কুমার

অবশ্যই, str - হ'ল আমাদের উত্সের স্ট্রিং, সাবএসআরটি - একটি স্ট্রিং। লক্ষ্যটি হল স্ট্রিং-এ সাবএসটিআর এর সংখ্যার পরিমাণ গণনা করা। এটি করার জন্য, আমরা সূত্রটি ব্যবহার করি: (আব) / সি, যেখানে একটি - স্ট্রের দৈর্ঘ্য, খ - সাবএসআরটির সমস্ত উপস্থিতি ছাড়াই স্ট্রের দৈর্ঘ্য (আমরা এর জন্য সাবএসটিআরটির সমস্ত উপস্থিতি অপসারণ করি), সি - সাবএসটিআর এর দৈর্ঘ্য । সুতরাং, মূলত আমরা সমস্ত সাবস্ট্রিটি ছাড়াই স্ট্র - দৈর্ঘ্যের স্ট্রিংয়ের দৈর্ঘ্য থেকে বের করি এবং তারপরে আমরা সাবএসটিআর এর দৈর্ঘ্যের উপর ফলাফলকে ভাগ করি। আপনার যদি অন্য কোনও প্রশ্ন থাকে তবে দয়া করে আমাকে জানান।
ম্যাকসেম ওভসিয়ানিকভ

সন্তোষ, আপনাকে স্বাগতম! গুরুত্বপূর্ণ অংশটি সাবএসটিআর এর জন্য প্যাটার্ন.কোইট ব্যবহার করা, অন্যথায় কিছু ক্ষেত্রে এটির মতো ব্যর্থ হতে পারে: str = "এটি একটি পরীক্ষা \\ n \\ r স্ট্রিং", সাবএসটিআর = "\\ r"। এখানে প্রদত্ত কিছু অনুরূপ উত্তর প্যাটার্ন ব্যবহার করে না, সুতরাং তারা এ জাতীয় ক্ষেত্রে ব্যর্থ হবে।
ম্যাকসেম ওভসিয়ানিকভ

রেজেক্সের কোনও কারণ নেই, ব্যবহার নেই replace, নেই replaceAll
নাটস


3
public int indexOf(int ch,
                   int fromIndex)

সুনির্দিষ্ট অক্ষরের প্রথম উপস্থিতির এই স্ট্রিংয়ের মধ্যে সূচকটি প্রদান করে নির্দিষ্ট সূচীতে অনুসন্ধান শুরু করে।

সুতরাং আপনার lastindexমান সর্বদা 0 থাকে এবং এটি সর্বদা স্ট্রিংয়ে হ্যালো খুঁজে পায় ।


2

সঠিক হিসাবে দেওয়া উত্তর লাইন রিটার্নের মতো জিনিসগুলি গণনা করার পক্ষে ভাল না এবং এটি খুব ভার্জোজ। পরবর্তী উত্তরগুলি আরও ভাল তবে সবগুলি সহজভাবে অর্জন করা যায়

str.split(findStr).length

এটি প্রশ্নের উত্তর ব্যবহার করে পিছনে থাকা ম্যাচগুলি ফেলে না।


1
এটি ইতিমধ্যে অন্য উত্তরে hasাকা পড়েছে ; এবং এই উত্তরটি এটি আরও ভাল করেছে।
michaelb958 - GoFundMonica

1
এটি অন্য উত্তর নয়, প্রশ্নের উত্তরের একটি মন্তব্য হওয়া উচিত।
james.garriss

2

ইনবিল্ট লাইব্রেরি ফাংশনটি ব্যবহার করে আপনি সংখ্যক ঘটনা ঘটাতে পারেন:

import org.springframework.util.StringUtils;
StringUtils.countOccurrencesOf(result, "R-")

1
কাজ করে না, আপনার ব্যবহৃত নির্ভরতা নির্দিষ্ট করা উচিত।
সৈকত

1

lastIndex+=findStr.length()আপনার লুপের শেষে যুক্ত করার চেষ্টা করুন , অন্যথায় আপনি একটি অন্তহীন লুপে শেষ হয়ে যাবেন কারণ আপনি একবার স্ট্রিংটি খুঁজে পেয়েছেন, আপনি একই সর্বশেষ অবস্থান থেকে বার বার এটি সন্ধান করার চেষ্টা করছেন।


1

আর একবার চেষ্টা কর. এটি একটি সাথে সমস্ত ম্যাচ প্রতিস্থাপন করে -

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int numberOfMatches = 0;
while (str.contains(findStr)){
    str = str.replaceFirst(findStr, "-");
    numberOfMatches++;
}

এবং যদি আপনি নিজেরটি ধ্বংস করতে না চান তবে আপনি strএকই বিষয়বস্তু সহ একটি নতুন স্ট্রিং তৈরি করতে পারেন:

String str = "helloslkhellodjladfjhello";
String strDestroy = str;
String findStr = "hello";
int numberOfMatches = 0;
while (strDestroy.contains(findStr)){
    strDestroy = strDestroy.replaceFirst(findStr, "-");
    numberOfMatches++;
}

এই ব্লকটি কার্যকর করার পরে এগুলি আপনার মান হবে:

str = "helloslkhellodjladfjhello"
strDestroy = "-slk-djladfj-"
findStr = "hello"
numberOfMatches = 3

1

@ মিঃ_আর_আমস_ডি প্রস্তাবিত হিসাবে:

String haystack = "hellolovelyworld";
String needle = "lo";
return haystack.split(Pattern.quote(needle), -1).length - 1;

1

বিদ্যমান উত্তর (গুলি) এর উপর ভিত্তি করে আমি নিম্নলিখিতটি ছাড়াই একটি "সংক্ষিপ্ত" সংস্করণ যুক্ত করতে চাই:

String str = "helloslkhellodjladfjhello";
String findStr = "hello";

int count = 0, lastIndex = 0;
while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) {
    lastIndex += findStr.length() - 1;
    count++;
}

System.out.println(count); // output: 3

স্ট্রিংটি পুনরাবৃত্তি করে যদি এটি অ্যাকাউন্টে নেয় তবে উদাহরণস্বরূপ যদি আপনি স্ট্রিং 'xxx' এর স্ট্রিং 'xx' খুঁজছেন।
tCoe

1

কোনও ব্যবহারকারীর প্রবেশের স্ট্রিংয়ে টোকনটি কতবার ঘটেছে তা গণনা করার জন্য এখানে উন্নত সংস্করণটি রয়েছে:

public class StringIndexOf {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Enter a sentence please: \n");
        String string = scanner.nextLine();

        int atIndex = 0;
        int count = 0;

        while (atIndex != -1)
        {
            atIndex = string.indexOf("hello", atIndex);

            if(atIndex != -1)
            {
                count++;
                atIndex += 5;
            }
        }

        System.out.println(count);
    }

}

1

নীচের এই পদ্ধতিটি দেখায় যে আপনার পুরো স্ট্রিংয়ে কত সময় সাবস্ট্রিং পুনরাবৃত্তি হয়। আশা করি আপনার জন্য পূর্ণ ব্যবহার: -

    String searchPattern="aaa"; // search string
    String str="aaaaaababaaaaaa"; // whole string
    int searchLength = searchPattern.length(); 
    int totalLength = str.length(); 
    int k = 0;
    for (int i = 0; i < totalLength - searchLength + 1; i++) {
        String subStr = str.substring(i, searchLength + i);
        if (subStr.equals(searchPattern)) {
           k++;
        }

    }

0

রেজিপ্সপ / প্যাটার্ন / ম্যাথার ব্যবহার না করে এমনকি স্ট্রিং ইউটিলস ব্যবহার না করেই এখানে অন্য সমাধান রয়েছে।

String str = "helloslkhellodjladfjhelloarunkumarhelloasdhelloaruhelloasrhello";
        String findStr = "hello";
        int count =0;
        int findStrLength = findStr.length();
        for(int i=0;i<str.length();i++){
            if(findStr.startsWith(Character.toString(str.charAt(i)))){
                if(str.substring(i).length() >= findStrLength){
                    if(str.substring(i, i+findStrLength).equals(findStr)){
                        count++;
                    }
                }
            }
        }
        System.out.println(count);

0

আপনার যদি প্রতিটি স্ট্রিংয়ের মূল স্ট্রিংয়ের সূচক প্রয়োজন হয় তবে আপনি সূচিপত্রের সাথে এই জাতীয় কিছু করতে পারেন:

 private static List<Integer> getAllIndexesOfSubstringInString(String fullString, String substring) {
    int pointIndex = 0;
    List<Integer> allOccurences = new ArrayList<Integer>();
    while(fullPdfText.indexOf(substring,pointIndex) >= 0){
       allOccurences.add(fullPdfText.indexOf(substring, pointIndex));
       pointIndex = fullPdfText.indexOf(substring, pointIndex) + substring.length();
    }
    return allOccurences;
}

0
public static int getCountSubString(String str , String sub){
int n = 0, m = 0, counter = 0, counterSub = 0;
while(n < str.length()){
  counter = 0;
  m = 0;
  while(m < sub.length() && str.charAt(n) == sub.charAt(m)){
    counter++;
    m++; n++;
  }
  if (counter == sub.length()){
    counterSub++;
    continue;
  }
  else if(counter > 0){
    continue;
  }
  n++;
}

return  counterSub;

}


এই প্রশ্নটি 8 বছরের পুরনো, এবং পোস্ট হওয়া 22 টি সমাধানের চেয়ে এটি কেন আরও ভাল সমাধানের কোনও ইঙ্গিত ছাড়াই সম্ভবত এটি অপসারণ করা উচিত
জেসন হুইলার

0

এই দ্রষ্টব্যটিতে স্ট্রিং জুড়ে প্রদত্ত সাবস্ট্রিংয়ের মোট সংখ্যার সংখ্যা মুদ্রণ করে, এর মধ্যে ওভারল্যাপিং মিলগুলির উপস্থিতিগুলিও অন্তর্ভুক্ত থাকে।

class SubstringMatch{
    public static void main(String []args){
        //String str = "aaaaabaabdcaa";
        //String sub = "aa";
        //String str = "caaab";
        //String sub = "aa";
        String str="abababababaabb";
        String sub = "bab";

        int n = str.length();
        int m = sub.length();

        // index=-1 in case of no match, otherwise >=0(first match position)
        int index=str.indexOf(sub), i=index+1, count=(index>=0)?1:0;
        System.out.println(i+" "+index+" "+count);

        // i will traverse up to only (m-n) position
        while(index!=-1 && i<=(n-m)){   
            index=str.substring(i, n).indexOf(sub);
            count=(index>=0)?count+1:count;
            i=i+index+1;  
            System.out.println(i+" "+index);
        }
        System.out.println("count: "+count);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.