আমার স্ট্রিং আছে
a.b.c.d
আমি 'এর ঘটনাগুলি গণনা করতে চাই।' একটি অহঙ্কারী উপায়ে, একটি ওয়ানলাইনার সাধারণত।
(পূর্বে আমি এই বাধাটি "লুপ ছাড়াই" হিসাবে প্রকাশ করেছি, যদি আপনি ভাবছেন যে লুপটি ব্যবহার না করে কেন সবাই উত্তর দেওয়ার চেষ্টা করছে)।
আমার স্ট্রিং আছে
a.b.c.d
আমি 'এর ঘটনাগুলি গণনা করতে চাই।' একটি অহঙ্কারী উপায়ে, একটি ওয়ানলাইনার সাধারণত।
(পূর্বে আমি এই বাধাটি "লুপ ছাড়াই" হিসাবে প্রকাশ করেছি, যদি আপনি ভাবছেন যে লুপটি ব্যবহার না করে কেন সবাই উত্তর দেওয়ার চেষ্টা করছে)।
উত্তর:
এর জন্য আমার 'আইডোমেটিক ওয়ান-লাইনার' হ'ল:
int count = StringUtils.countMatches("a.b.c.d", ".");
এটি ইতিমধ্যে প্রবেশ করার সময় কেন এটি নিজেকে লিখুন কমন্স ল্যাং এ থাকা ?
এর জন্য স্প্রিং ফ্রেমওয়ার্কের অনলাইনার হ'ল:
int occurance = StringUtils.countOccurrencesOf("a.b.c.d", ".");
int count = CharMatcher.is('.').countIn("a.b.c.d");
... যেমন একটি সদৃশ প্রশ্নের ডগবনে উত্তর ।
এই সম্পর্কে কিভাবে। এটি নীচে রিজেক্সপ ব্যবহার করে না তাই অন্যান্য সমাধানগুলির চেয়ে দ্রুত হওয়া উচিত এবং লুপ ব্যবহার করবে না।
int count = line.length() - line.replace(".", "").length();
ওয়ান-লাইনার ব্যবহার করে এটি করার সমস্ত উপায় কী এবং আমি কী জানি তার সারসংক্ষেপ করুন:
String testString = "a.b.c.d";
1) অ্যাপাচি কমন্স ব্যবহার করা
int apache = StringUtils.countMatches(testString, ".");
System.out.println("apache = " + apache);
2) স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করে
int spring = org.springframework.util.StringUtils.countOccurrencesOf(testString, ".");
System.out.println("spring = " + spring);
3) প্রতিস্থাপন ব্যবহার
int replace = testString.length() - testString.replace(".", "").length();
System.out.println("replace = " + replace);
4) রিপ্লেসএল (কেস 1) ব্যবহার করে
int replaceAll = testString.replaceAll("[^.]", "").length();
System.out.println("replaceAll = " + replaceAll);
5) রিপ্লেসএল ব্যবহার করে (কেস 2)
int replaceAllCase2 = testString.length() - testString.replaceAll("\\.", "").length();
System.out.println("replaceAll (second case) = " + replaceAllCase2);
6) বিভক্ত ব্যবহার
int split = testString.split("\\.",-1).length-1;
System.out.println("split = " + split);
7) জাভা 8 ব্যবহার করে (কেস 1)
long java8 = testString.chars().filter(ch -> ch =='.').count();
System.out.println("java8 = " + java8);
8) জাভা 8 (কেস 2) ব্যবহার করা, ইউনিকোডের ক্ষেত্রে কেস 1 এর চেয়ে ভাল
long java8Case2 = testString.codePoints().filter(ch -> ch =='.').count();
System.out.println("java8 (second case) = " + java8Case2);
9) স্ট্রিংটোকেনাইজার ব্যবহার করে
int stringTokenizer = new StringTokenizer(" " +testString + " ", ".").countTokens()-1;
System.out.println("stringTokenizer = " + stringTokenizer);
মন্তব্য থেকে : স্ট্রিংটোকেনাইজারের জন্য সাবধান থাকুন, এবিসিডির জন্য এটি কাজ করবে তবে একটি ... বিসি ... ডি বা ... অ্যাবিসিডি বা একটি .... খ ...... সি ..... ডি ... বা ইত্যাদি কাজ করে না। এটি কেবল গণনা করা হবে। অক্ষরের মাঝে একবার
গিথুবে আরও তথ্য
পারফোমেন্স পরীক্ষা ( জেএমএইচ , মোড = অ্যাভারেজটাইম ব্যবহার করে , 0.010
আরও ভাল স্কোর করুন 0.351
):
Benchmark Mode Cnt Score Error Units
1. countMatches avgt 5 0.010 ± 0.001 us/op
2. countOccurrencesOf avgt 5 0.010 ± 0.001 us/op
3. stringTokenizer avgt 5 0.028 ± 0.002 us/op
4. java8_1 avgt 5 0.077 ± 0.005 us/op
5. java8_2 avgt 5 0.078 ± 0.003 us/op
6. split avgt 5 0.137 ± 0.009 us/op
7. replaceAll_2 avgt 5 0.302 ± 0.047 us/op
8. replace avgt 5 0.303 ± 0.034 us/op
9. replaceAll_1 avgt 5 0.351 ± 0.045 us/op
"1🚲2🚲3 has 2".codePoints().filter((c) -> c == "🚲".codePointAt(0)).count()
যত তাড়াতাড়ি বা পরে, কিছু লুপ করতে হবে। আপনার পক্ষে (খুব সাধারণ) লুপটি লেখার মতো কিছু ব্যবহার করার চেয়ে সহজsplit
আপনার প্রয়োজনের চেয়ে অনেক বেশি শক্তিশালী ।
সমস্ত উপায়ে একটি পৃথক পদ্ধতিতে লুপটি encapsulate, যেমন
public static int countOccurrences(String haystack, char needle)
{
int count = 0;
for (int i=0; i < haystack.length(); i++)
{
if (haystack.charAt(i) == needle)
{
count++;
}
}
return count;
}
তারপরে আপনার মূল কোডটিতে লুপ থাকা দরকার নেই - তবে লুপটি কোথাও থাকতে হবে।
length()
লুপের বাইরে কলটি সরিয়ে নেওয়া পারফরম্যান্সকে আরও খারাপ করতে পারে , যেমনটি @ শুগিকুক কিছু মন্তব্য করেছেন।
ম্লাদেনের মতো আমার ধারণা ছিল, তবে বিপরীত ...
String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
println(charCount);
replaceAll()
এবং length()
। ঠিক আছে, যদি এটি দৃশ্যমান না হয় তবে এর অস্তিত্ব নেই; ও)
String s = "a.b.c.d";
int charCount = s.length() - s.replaceAll("\\.", "").length();
রিপ্লেসএল ("।") সমস্ত অক্ষর প্রতিস্থাপন করবে।
পিলহোর সমাধানটিতে রিপ্লেসএল ("[^।]", "") ব্যবহার করা হয়েছে, যেটিকে পালানোর দরকার নেই, যেহেতু [।] 'কোনও অক্ষর' নয়, 'ডট' চরিত্রটিকে উপস্থাপন করে।
আমার 'আইডোমেটিক ওয়ান-লাইনার' সমাধান:
int count = "a.b.c.d".length() - "a.b.c.d".replace(".", "").length();
স্ট্রিংগিলগুলি ব্যবহার করে এমন কোনও সমাধান কেন গৃহীত হয়েছে তা সম্পর্কে কোনও ধারণা নেই।
একটি সংক্ষিপ্ত উদাহরণ
String text = "a.b.c.d";
int count = text.split("\\.",-1).length-1;
এখানে একটি লুপ ছাড়াই একটি সমাধান:
public static int countOccurrences(String haystack, char needle, int i){
return ((i=haystack.indexOf(needle, i)) == -1)?0:1+countOccurrences(haystack, needle, i+1);}
System.out.println("num of dots is "+countOccurrences("a.b.c.d",'.',0));
ভাল, একটি লুপ আছে, কিন্তু এটি অদৃশ্য :-)
- যোনাতন
এই উদ্দেশ্যে একটি নতুন স্ট্রিং বরাদ্দ করার ধারণাটি আমি পছন্দ করি না। এবং স্ট্রিংটির ইতিমধ্যে পিছনে একটি চর অ্যারে রয়েছে যেখানে এটি এর মান সঞ্চয় করে, স্ট্রিংকআরএট () কার্যত নিখরচায়।
for(int i=0;i<s.length();num+=(s.charAt(i++)==delim?1:0))
কেবল জে 2 এসই দিয়ে 1 লাইন বা তারও কম সংকলন প্রয়োজন এমন অতিরিক্ত বরাদ্দ ছাড়াই কৌশলটি কাজ করে।
charAt
অক্ষর নয় 16 বিট কোড পয়েন্ট মাধ্যমে পুনরাবৃত্তি! char
জাভা এ ক একটি চরিত্র নয়। সুতরাং এই উত্তরটি বোঝাচ্ছে যে কোনও ইউনিকোড প্রতীক অবশ্যই একটি উচ্চ সরোগেটের কোড পয়েন্টের সমান হতে হবে delim
। এটি বিন্দুর জন্য সঠিক কিনা তা আমি নিশ্চিত নই, তবে সাধারণভাবে এটি সঠিক নাও হতে পারে।
ঠিক আছে, যোনাতনের সমাধান দ্বারা অনুপ্রাণিত, এখানে একটি যা নিখুঁতভাবে পুনরাবৃত্তিযোগ্য - কেবলমাত্র গ্রন্থাগার পদ্ধতি ব্যবহৃত হয় length()
এবং charAt()
যার মধ্যে কোনওটি লুপিং করে না:
public static int countOccurrences(String haystack, char needle)
{
return countOccurrences(haystack, needle, 0);
}
private static int countOccurrences(String haystack, char needle, int index)
{
if (index >= haystack.length())
{
return 0;
}
int contribution = haystack.charAt(index) == needle ? 1 : 0;
return contribution + countOccurrences(haystack, needle, index+1);
}
লুপিং হিসাবে পুনরাবৃত্তি গণনা করা হয় তা নির্ভর করে আপনি কোন সঠিক সংজ্ঞাটি ব্যবহার করেন তার উপর নির্ভর করে তবে এটি সম্ভবত আপনি যতটা কাছাকাছি পাবেন।
আমি জানি না যে বেশিরভাগ জেভিএমরা আজকাল পুচ্ছ-পুনরাবৃত্তি করে কিনা ... যদি না হয় তবে অবশ্যই উপযুক্ত দীর্ঘ স্ট্রিংয়ের জন্য আপনি উপাধি স্ট্যাকের ওভারফ্লো পাবেন।
জোন স্কিট দ্বারা অনুপ্রাণিত, একটি নন-লুপ সংস্করণ যা আপনার স্ট্যাকটি ফুঁকবে না। এছাড়াও আপনি কাঁটাচামচ ফ্রেমওয়ার্ক ব্যবহার করতে চাইলে দরকারী সূচনা পয়েন্ট point
public static int countOccurrences(CharSequeunce haystack, char needle) {
return countOccurrences(haystack, needle, 0, haystack.length);
}
// Alternatively String.substring/subsequence use to be relatively efficient
// on most Java library implementations, but isn't any more [2013].
private static int countOccurrences(
CharSequence haystack, char needle, int start, int end
) {
if (start == end) {
return 0;
} else if (start+1 == end) {
return haystack.charAt(start) == needle ? 1 : 0;
} else {
int mid = (end+start)>>>1; // Watch for integer overflow...
return
countOccurrences(haystack, needle, start, mid) +
countOccurrences(haystack, needle, mid, end);
}
}
(অস্বীকৃতি: পরীক্ষিত নয়, সংকলিত নয়, বুদ্ধিমানও নয়))
এটি লেখার জন্য সম্ভবত সেরা (একক থ্রেডেড, কোনও সারোগেট-জুড়ি সমর্থন নয়):
public static int countOccurrences(String haystack, char needle) {
int count = 0;
for (char c : haystack.toCharArray()) {
if (c == needle) {
++count;
}
}
return count;
}
এর দক্ষতা সম্পর্কে নিশ্চিত নয়, তবে এটি তৃতীয় পক্ষের লিবি না নিয়েই আমি লিখতে পারি যে সংক্ষিপ্ততম কোড:
public static int numberOf(String target, String content)
{
return (content.split(target).length - 1);
}
সঙ্গে জাভা-8এটি অর্জনের জন্য আপনি স্ট্রিমও ব্যবহার করতে পারেন। স্পষ্টতই পর্দার পিছনে একটি পুনরাবৃত্তি রয়েছে, তবে আপনাকে এটি স্পষ্টভাবে লিখতে হবে না!
public static long countOccurences(String s, char c){
return s.chars().filter(ch -> ch == c).count();
}
countOccurences("a.b.c.d", '.'); //3
countOccurences("hello world", 'l'); //3
.codePoints()
পরিবর্তে ব্যবহার করে .chars()
কোনও ইউনিকোড মানকে সমর্থন করা উচিত (যার সাথে সারোগেট জোড়া
এই সমস্যাটি সমাধান করতে জাভা 8 হ্রাস ব্যবহার করাও সম্ভব:
int res = "abdsd3$asda$asasdd$sadas".chars().reduce(0, (a, c) -> a + (c == '$' ? 1 : 0));
System.out.println(res);
আউটপুট:
3
সম্পূর্ণ নমুনা:
public class CharacterCounter
{
public static int countOccurrences(String find, String string)
{
int count = 0;
int indexOf = 0;
while (indexOf > -1)
{
indexOf = string.indexOf(find, indexOf + 1);
if (indexOf > -1)
count++;
}
return count;
}
}
কল করুন:
int occurrences = CharacterCounter.countOccurrences("l", "Hello World.");
System.out.println(occurrences); // 3
উত্তর পাওয়ার সহজ উপায় হ'ল নিম্নরূপ:
public static void main(String[] args) {
String string = "a.b.c.d";
String []splitArray = string.split("\\.",-1);
System.out.println("No of . chars is : " + (splitArray.length-1));
}
আপনি যদি বসন্তের কাঠামো ব্যবহার করেন তবে আপনি "স্ট্রিং ইউটিলস" বর্গও ব্যবহার করতে পারেন। পদ্ধতিটি হবে "কাউন্টোসিভারেন্সঅফ"।
আপনি split()
কেবলমাত্র একটি লাইন কোডে ফাংশনটি ব্যবহার করতে পারেন
int noOccurence=string.split("#",-1).length-1;
limit
এই ওভারলোডেড স্প্লিট পদ্ধতি কলটিতে শূন্যতে সেট করা আছে। একটি উদাহরণ: "1##2#3#####".split("#")
কেবলমাত্র [0:"1";1:""; 2:"2"; 3:"3"]
9 ( [0:"1"; 1:""; 2:"2"; 3:"3"; 4:""; 5:""; 6:""; 7:""; 8:""]
) এর পরিবর্তে আকার 4 ( ) আকারের একটি অ্যারে দেবে ।
public static int countOccurrences(String container, String content){
int lastIndex, currIndex = 0, occurrences = 0;
while(true) {
lastIndex = container.indexOf(content, currIndex);
if(lastIndex == -1) {
break;
}
currIndex = lastIndex + content.length();
occurrences++;
}
return occurrences;
}
import java.util.Scanner;
class apples {
public static void main(String args[]) {
Scanner bucky = new Scanner(System.in);
String hello = bucky.nextLine();
int charCount = hello.length() - hello.replaceAll("e", "").length();
System.out.println(charCount);
}
}// COUNTS NUMBER OF "e" CHAR´s within any string input
যদিও পদ্ধতিগুলি এটিকে আড়াল করতে পারে, লুপ (বা পুনরাবৃত্তি) ছাড়া গণনা করার কোনও উপায় নেই। পারফরম্যান্স কারণে আপনি একটি চর [] ব্যবহার করতে চান যদিও।
public static int count( final String s, final char c ) {
final char[] chars = s.toCharArray();
int count = 0;
for(int i=0; i<chars.length; i++) {
if (chars[i] == c) {
count++;
}
}
return count;
}
রিপ্লেসমএল (এটি আরইউ) ব্যবহার করা সবচেয়ে ভাল যাওয়ার মতো শোনায় না।
ঠিক আছে, বেশ একটি অনুরূপ কাজ দিয়ে আমি এই থ্রেডটিতে হোঁচট খেয়েছি। আমি কোনও প্রোগ্রামিং ভাষার সীমাবদ্ধতা দেখতে পাইনি এবং যেহেতু গ্রোভি জাভা ভিএম-তে চালায়: আমি গ্রোভি ব্যবহার করে কীভাবে আমার সমস্যা সমাধান করতে সক্ষম হয়েছিল তা এখানে।
"a.b.c.".count(".")
সম্পন্ন.
আরও সহজ সমাধান হ'ল আপনি যে চরিত্রটির সাথে এটি মিলছেন তার উপর ভিত্তি করে স্ট্রিংটি বিভক্ত করা।
এই ক্ষেত্রে,
int getOccurences(String characters, String string) {
String[] words = string.split(characters);
return words.length - 1;
}
এটি ক্ষেত্রে 4 ফিরে আসবে:
getOccurences("o", "something about a quick brown fox");
কোডের কোথাও কোথাও কিছু লুপ করতে হবে। এর চারপাশের একমাত্র উপায় হ'ল লুপের সম্পূর্ণ তালিকাভুক্তি:
int numDots = 0;
if (s.charAt(0) == '.') {
numDots++;
}
if (s.charAt(1) == '.') {
numDots++;
}
if (s.charAt(2) == '.') {
numDots++;
}
... ইত্যাদি, তবে তারপরে আপনি নিজে নিজে লুপটি করছেন, উত্স সম্পাদকটিতে - কম্পিউটারটি বদলে চালাবে। সিউডোকোডটি দেখুন:
create a project
position = 0
while (not end of string) {
write check for character at position "position" (see above)
}
write code to output variable "numDots"
compile program
hand in homework
do not think of the loop that your "if"s may have been optimized and compiled to
এখানে কিছুটা আলাদা স্টাইলের পুনরাবৃত্তি সমাধান দেওয়া হল:
public static int countOccurrences(String haystack, char needle)
{
return countOccurrences(haystack, needle, 0);
}
private static int countOccurrences(String haystack, char needle, int accumulator)
{
if (haystack.length() == 0) return accumulator;
return countOccurrences(haystack.substring(1), needle, haystack.charAt(0) == needle ? accumulator + 1 : accumulator);
}
কেন কেবল চরিত্রটিতে বিভক্ত হন না এবং তারপরে ফলাফলের অ্যারের দৈর্ঘ্য পান। অ্যারের দৈর্ঘ্য সর্বদা উদাহরণগুলির সংখ্যা হবে? 1। ঠিক?
নিম্নলিখিত উত্স কোডটি আপনাকে ব্যবহারকারী দ্বারা প্রবেশ করানো একটি শব্দে একটি প্রদত্ত স্ট্রিংয়ের উপস্থিতির জন্য নং দিবে: -
import java.util.Scanner;
public class CountingOccurences {
public static void main(String[] args) {
Scanner inp= new Scanner(System.in);
String str;
char ch;
int count=0;
System.out.println("Enter the string:");
str=inp.nextLine();
while(str.length()>0)
{
ch=str.charAt(0);
int i=0;
while(str.charAt(i)==ch)
{
count =count+i;
i++;
}
str.substring(count);
System.out.println(ch);
System.out.println(count);
}
}
}