How to find a substring in a string and get its count using java
up vote
-1
down vote
favorite
I have been given a problem where I need to find the substring in a char array and have to count how many times that substring occurred.
For eg: "aabbcccddaabbbccc"
O/P:
aa:2
bb:1
ccc:2
dd:1
bbb:1
I tried this code but it is not giving me proper solution, if someone could suggest me what I am doing wrong
public class CountSubString {
static Set set=new HashSet<>();
static List list=new ArrayList<>();
private static Map<char, Integer> count(char charArrayToParse){
Map<char, Integer> subString = new HashMap<char, Integer>();
for (int i=0; i<charArrayToParse.length ;)
{StringBuilder word= new StringBuilder();
for (int j=i; j<charArrayToParse.length; j++) {
if(charArrayToParse[i] == charArrayToParse[j]) {
word.append(charArrayToParse[j]);
}
else {
char subStringDone = word.toString().toCharArray();
if(subString.isEmpty())
subString.put(subStringDone, 1);
else if(subString.containsKey(subStringDone)) {
subString.put(subStringDone, subString.get(subStringDone)+1);
}
else {
subString.put(subStringDone, 1);
}
//System.out.println("Word value are"+subString.get(key));
i=j;
break;
}
}
}
Set<char> keyValues= subString.keySet();
for(char ch : keyValues) {
if(subString.get(ch)>1) {
System.out.println(ch+"--->"+subString.get(ch));
}
}
return subString;
}
public static void main(String args) {
// TODO Auto-generated method stub
String str = "aaabbbccddddaaaeebbb";
char charArray = str.toCharArray();
Map<char, Integer> parsedArray= new HashMap<char, Integer>();
parsedArray= count(charArray);
}
}
java string hashmap
add a comment |
up vote
-1
down vote
favorite
I have been given a problem where I need to find the substring in a char array and have to count how many times that substring occurred.
For eg: "aabbcccddaabbbccc"
O/P:
aa:2
bb:1
ccc:2
dd:1
bbb:1
I tried this code but it is not giving me proper solution, if someone could suggest me what I am doing wrong
public class CountSubString {
static Set set=new HashSet<>();
static List list=new ArrayList<>();
private static Map<char, Integer> count(char charArrayToParse){
Map<char, Integer> subString = new HashMap<char, Integer>();
for (int i=0; i<charArrayToParse.length ;)
{StringBuilder word= new StringBuilder();
for (int j=i; j<charArrayToParse.length; j++) {
if(charArrayToParse[i] == charArrayToParse[j]) {
word.append(charArrayToParse[j]);
}
else {
char subStringDone = word.toString().toCharArray();
if(subString.isEmpty())
subString.put(subStringDone, 1);
else if(subString.containsKey(subStringDone)) {
subString.put(subStringDone, subString.get(subStringDone)+1);
}
else {
subString.put(subStringDone, 1);
}
//System.out.println("Word value are"+subString.get(key));
i=j;
break;
}
}
}
Set<char> keyValues= subString.keySet();
for(char ch : keyValues) {
if(subString.get(ch)>1) {
System.out.println(ch+"--->"+subString.get(ch));
}
}
return subString;
}
public static void main(String args) {
// TODO Auto-generated method stub
String str = "aaabbbccddddaaaeebbb";
char charArray = str.toCharArray();
Map<char, Integer> parsedArray= new HashMap<char, Integer>();
parsedArray= count(charArray);
}
}
java string hashmap
right now you have infinite loop, because you are not incrementing youri
in for...
– Schidu Luca
Nov 9 at 13:22
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25
add a comment |
up vote
-1
down vote
favorite
up vote
-1
down vote
favorite
I have been given a problem where I need to find the substring in a char array and have to count how many times that substring occurred.
For eg: "aabbcccddaabbbccc"
O/P:
aa:2
bb:1
ccc:2
dd:1
bbb:1
I tried this code but it is not giving me proper solution, if someone could suggest me what I am doing wrong
public class CountSubString {
static Set set=new HashSet<>();
static List list=new ArrayList<>();
private static Map<char, Integer> count(char charArrayToParse){
Map<char, Integer> subString = new HashMap<char, Integer>();
for (int i=0; i<charArrayToParse.length ;)
{StringBuilder word= new StringBuilder();
for (int j=i; j<charArrayToParse.length; j++) {
if(charArrayToParse[i] == charArrayToParse[j]) {
word.append(charArrayToParse[j]);
}
else {
char subStringDone = word.toString().toCharArray();
if(subString.isEmpty())
subString.put(subStringDone, 1);
else if(subString.containsKey(subStringDone)) {
subString.put(subStringDone, subString.get(subStringDone)+1);
}
else {
subString.put(subStringDone, 1);
}
//System.out.println("Word value are"+subString.get(key));
i=j;
break;
}
}
}
Set<char> keyValues= subString.keySet();
for(char ch : keyValues) {
if(subString.get(ch)>1) {
System.out.println(ch+"--->"+subString.get(ch));
}
}
return subString;
}
public static void main(String args) {
// TODO Auto-generated method stub
String str = "aaabbbccddddaaaeebbb";
char charArray = str.toCharArray();
Map<char, Integer> parsedArray= new HashMap<char, Integer>();
parsedArray= count(charArray);
}
}
java string hashmap
I have been given a problem where I need to find the substring in a char array and have to count how many times that substring occurred.
For eg: "aabbcccddaabbbccc"
O/P:
aa:2
bb:1
ccc:2
dd:1
bbb:1
I tried this code but it is not giving me proper solution, if someone could suggest me what I am doing wrong
public class CountSubString {
static Set set=new HashSet<>();
static List list=new ArrayList<>();
private static Map<char, Integer> count(char charArrayToParse){
Map<char, Integer> subString = new HashMap<char, Integer>();
for (int i=0; i<charArrayToParse.length ;)
{StringBuilder word= new StringBuilder();
for (int j=i; j<charArrayToParse.length; j++) {
if(charArrayToParse[i] == charArrayToParse[j]) {
word.append(charArrayToParse[j]);
}
else {
char subStringDone = word.toString().toCharArray();
if(subString.isEmpty())
subString.put(subStringDone, 1);
else if(subString.containsKey(subStringDone)) {
subString.put(subStringDone, subString.get(subStringDone)+1);
}
else {
subString.put(subStringDone, 1);
}
//System.out.println("Word value are"+subString.get(key));
i=j;
break;
}
}
}
Set<char> keyValues= subString.keySet();
for(char ch : keyValues) {
if(subString.get(ch)>1) {
System.out.println(ch+"--->"+subString.get(ch));
}
}
return subString;
}
public static void main(String args) {
// TODO Auto-generated method stub
String str = "aaabbbccddddaaaeebbb";
char charArray = str.toCharArray();
Map<char, Integer> parsedArray= new HashMap<char, Integer>();
parsedArray= count(charArray);
}
}
java string hashmap
java string hashmap
asked Nov 9 at 13:12
Developer52
204417
204417
right now you have infinite loop, because you are not incrementing youri
in for...
– Schidu Luca
Nov 9 at 13:22
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25
add a comment |
right now you have infinite loop, because you are not incrementing youri
in for...
– Schidu Luca
Nov 9 at 13:22
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25
right now you have infinite loop, because you are not incrementing your
i
in for...– Schidu Luca
Nov 9 at 13:22
right now you have infinite loop, because you are not incrementing your
i
in for...– Schidu Luca
Nov 9 at 13:22
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25
add a comment |
3 Answers
3
active
oldest
votes
up vote
1
down vote
Since this looks like a homework assignment, I'm not going to post a code solution, but I'll point you in the right direction.
Your double for loop is creating an infinite loop. You're setting i = j
and it's not getting set high enough to break out of the loop (never goes past 17). Nested for loops in my book are usually a code smell, you've got something that should be broken into a few more functions (low cohesion).
In this case, your first function should be to break your string down into patterns. Your nested for loops can be reduced down to a single loop, and each time a pattern is found, add it to a Set<String>
instead of a map. This will prevent duplicates since a Set can only contain unique values.
You can then move on to the next part which is to figure out your pattern counts. Remember, in that case iterate over the string and check for matches. You'll need to take into account that aa
will also match aaa
when doing your counts.
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:Set<String> parseKeys(String input)
andMap<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.
– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines ofchar previousLetter
, update it inside of the for loop. Try some code, and share it.
– Jason Armstrong
Nov 10 at 13:35
add a comment |
up vote
0
down vote
Can you use libraries? If so there's StringUtils
in the apache.commons.lang3
that can solve the problem in a single line like this:
int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
add a comment |
up vote
0
down vote
Something to consider.. for bbaaarr
are there two sequences of aa
or just one? My solution considers that there are two but it can be easily adjusted for the other case.
Comments in my code to help explain it:
/**
* Returns the number of times the sequence occurs in the string.
* @param seq - the sequence you are looking for
* @param str - the string you are searching in
*/
private static int count(String seq, String str) {
if(seq == null || seq.isEmpty() ||
str == null || str.isEmpty() ){
return 0;
}
int count = 0;
// the first character of the sequence you are looking for
final char seqChar = seq.charAt(0);
// if there aren't seq.length() chars remaining then
// it's no longer possible to match your sequence
// so this is the max index to go to when looking for it
final int maxIndex = str.length() - seq.length();
// iterate through the characters in your string
for (int i = 0; i <= maxIndex; i++) {
// when you find a character matching the start of your sequence
// then compare the substring of equal length to your sequence
// and if it matches then you have a match
if (seqChar == str.charAt(i) &&
seq.equals(str.substring(i, i + seq.length()))) {
count++;
}
}
return count;
}
public static void main(String args){
String s = "aabbcccddaabbbccc";
System.out.println(count("aa", s)); // 2
// [aa]bbcccddaabbbccc
// aabbcccdd[aa]bbbccc
System.out.println(count("bb", s)); // 3
// aa[bb]cccddaabbbccc
// aabbcccddaa[bb]bccc
// aabbcccddaab[bbccc
System.out.println(count("cc", s)); // 4
// aabb[cc]cddaabbbccc
// aabbc[cc]ddaabbbccc
// aabbcccddaabbb[cc]c
// aabbcccddaabbbc[cc]
}
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226370%2fhow-to-find-a-substring-in-a-string-and-get-its-count-using-java%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
Since this looks like a homework assignment, I'm not going to post a code solution, but I'll point you in the right direction.
Your double for loop is creating an infinite loop. You're setting i = j
and it's not getting set high enough to break out of the loop (never goes past 17). Nested for loops in my book are usually a code smell, you've got something that should be broken into a few more functions (low cohesion).
In this case, your first function should be to break your string down into patterns. Your nested for loops can be reduced down to a single loop, and each time a pattern is found, add it to a Set<String>
instead of a map. This will prevent duplicates since a Set can only contain unique values.
You can then move on to the next part which is to figure out your pattern counts. Remember, in that case iterate over the string and check for matches. You'll need to take into account that aa
will also match aaa
when doing your counts.
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:Set<String> parseKeys(String input)
andMap<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.
– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines ofchar previousLetter
, update it inside of the for loop. Try some code, and share it.
– Jason Armstrong
Nov 10 at 13:35
add a comment |
up vote
1
down vote
Since this looks like a homework assignment, I'm not going to post a code solution, but I'll point you in the right direction.
Your double for loop is creating an infinite loop. You're setting i = j
and it's not getting set high enough to break out of the loop (never goes past 17). Nested for loops in my book are usually a code smell, you've got something that should be broken into a few more functions (low cohesion).
In this case, your first function should be to break your string down into patterns. Your nested for loops can be reduced down to a single loop, and each time a pattern is found, add it to a Set<String>
instead of a map. This will prevent duplicates since a Set can only contain unique values.
You can then move on to the next part which is to figure out your pattern counts. Remember, in that case iterate over the string and check for matches. You'll need to take into account that aa
will also match aaa
when doing your counts.
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:Set<String> parseKeys(String input)
andMap<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.
– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines ofchar previousLetter
, update it inside of the for loop. Try some code, and share it.
– Jason Armstrong
Nov 10 at 13:35
add a comment |
up vote
1
down vote
up vote
1
down vote
Since this looks like a homework assignment, I'm not going to post a code solution, but I'll point you in the right direction.
Your double for loop is creating an infinite loop. You're setting i = j
and it's not getting set high enough to break out of the loop (never goes past 17). Nested for loops in my book are usually a code smell, you've got something that should be broken into a few more functions (low cohesion).
In this case, your first function should be to break your string down into patterns. Your nested for loops can be reduced down to a single loop, and each time a pattern is found, add it to a Set<String>
instead of a map. This will prevent duplicates since a Set can only contain unique values.
You can then move on to the next part which is to figure out your pattern counts. Remember, in that case iterate over the string and check for matches. You'll need to take into account that aa
will also match aaa
when doing your counts.
Since this looks like a homework assignment, I'm not going to post a code solution, but I'll point you in the right direction.
Your double for loop is creating an infinite loop. You're setting i = j
and it's not getting set high enough to break out of the loop (never goes past 17). Nested for loops in my book are usually a code smell, you've got something that should be broken into a few more functions (low cohesion).
In this case, your first function should be to break your string down into patterns. Your nested for loops can be reduced down to a single loop, and each time a pattern is found, add it to a Set<String>
instead of a map. This will prevent duplicates since a Set can only contain unique values.
You can then move on to the next part which is to figure out your pattern counts. Remember, in that case iterate over the string and check for matches. You'll need to take into account that aa
will also match aaa
when doing your counts.
answered Nov 9 at 13:37
Jason Armstrong
652313
652313
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:Set<String> parseKeys(String input)
andMap<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.
– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines ofchar previousLetter
, update it inside of the for loop. Try some code, and share it.
– Jason Armstrong
Nov 10 at 13:35
add a comment |
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:Set<String> parseKeys(String input)
andMap<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.
– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines ofchar previousLetter
, update it inside of the for loop. Try some code, and share it.
– Jason Armstrong
Nov 10 at 13:35
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
Thank you for your direction, but I am not getting how to reduce it to one loop as the problem I am facing is I need to match characters before breaking it into possible substrings.. Can you please suggest me a generic way for achieving this.. It is not a assignment it was asked in a interview so am trying to crack this..
– Developer52
Nov 10 at 6:57
I'd decompose your current method into two separate methods:
Set<String> parseKeys(String input)
and Map<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.– Jason Armstrong
Nov 10 at 12:46
I'd decompose your current method into two separate methods:
Set<String> parseKeys(String input)
and Map<String, int> countMatches(String input, Set<String> keys)
The first method iterates the string, and you compare the current letter to the previous letter. If they're different, or the end of the array is reached, you add that sequence to the set. Since sets enforce uniqueness, you'll have substrings. Your second method then takes those unique substrings (keys) and counts the times it appears in the input string.– Jason Armstrong
Nov 10 at 12:46
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
I am not getting the way of how to compare the current letter and the previous letter without using two loops.. One more scenario is I have to match both the current indexes too as I have to add both the characters to substring if they are same.. For eg: aaabbbccc now here I have to add all the three a's so I have to add the current index as well as the next index too.
– Developer52
Nov 10 at 13:13
Try a local variable declared outside the for loop. Something along the lines of
char previousLetter
, update it inside of the for loop. Try some code, and share it.– Jason Armstrong
Nov 10 at 13:35
Try a local variable declared outside the for loop. Something along the lines of
char previousLetter
, update it inside of the for loop. Try some code, and share it.– Jason Armstrong
Nov 10 at 13:35
add a comment |
up vote
0
down vote
Can you use libraries? If so there's StringUtils
in the apache.commons.lang3
that can solve the problem in a single line like this:
int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
add a comment |
up vote
0
down vote
Can you use libraries? If so there's StringUtils
in the apache.commons.lang3
that can solve the problem in a single line like this:
int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
add a comment |
up vote
0
down vote
up vote
0
down vote
Can you use libraries? If so there's StringUtils
in the apache.commons.lang3
that can solve the problem in a single line like this:
int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
Can you use libraries? If so there's StringUtils
in the apache.commons.lang3
that can solve the problem in a single line like this:
int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
answered Nov 9 at 13:24
Amongalen
1529
1529
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
add a comment |
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
But I have to find all the substring and it's count, not only aa
– Developer52
Nov 10 at 6:27
add a comment |
up vote
0
down vote
Something to consider.. for bbaaarr
are there two sequences of aa
or just one? My solution considers that there are two but it can be easily adjusted for the other case.
Comments in my code to help explain it:
/**
* Returns the number of times the sequence occurs in the string.
* @param seq - the sequence you are looking for
* @param str - the string you are searching in
*/
private static int count(String seq, String str) {
if(seq == null || seq.isEmpty() ||
str == null || str.isEmpty() ){
return 0;
}
int count = 0;
// the first character of the sequence you are looking for
final char seqChar = seq.charAt(0);
// if there aren't seq.length() chars remaining then
// it's no longer possible to match your sequence
// so this is the max index to go to when looking for it
final int maxIndex = str.length() - seq.length();
// iterate through the characters in your string
for (int i = 0; i <= maxIndex; i++) {
// when you find a character matching the start of your sequence
// then compare the substring of equal length to your sequence
// and if it matches then you have a match
if (seqChar == str.charAt(i) &&
seq.equals(str.substring(i, i + seq.length()))) {
count++;
}
}
return count;
}
public static void main(String args){
String s = "aabbcccddaabbbccc";
System.out.println(count("aa", s)); // 2
// [aa]bbcccddaabbbccc
// aabbcccdd[aa]bbbccc
System.out.println(count("bb", s)); // 3
// aa[bb]cccddaabbbccc
// aabbcccddaa[bb]bccc
// aabbcccddaab[bbccc
System.out.println(count("cc", s)); // 4
// aabb[cc]cddaabbbccc
// aabbc[cc]ddaabbbccc
// aabbcccddaabbb[cc]c
// aabbcccddaabbbc[cc]
}
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
add a comment |
up vote
0
down vote
Something to consider.. for bbaaarr
are there two sequences of aa
or just one? My solution considers that there are two but it can be easily adjusted for the other case.
Comments in my code to help explain it:
/**
* Returns the number of times the sequence occurs in the string.
* @param seq - the sequence you are looking for
* @param str - the string you are searching in
*/
private static int count(String seq, String str) {
if(seq == null || seq.isEmpty() ||
str == null || str.isEmpty() ){
return 0;
}
int count = 0;
// the first character of the sequence you are looking for
final char seqChar = seq.charAt(0);
// if there aren't seq.length() chars remaining then
// it's no longer possible to match your sequence
// so this is the max index to go to when looking for it
final int maxIndex = str.length() - seq.length();
// iterate through the characters in your string
for (int i = 0; i <= maxIndex; i++) {
// when you find a character matching the start of your sequence
// then compare the substring of equal length to your sequence
// and if it matches then you have a match
if (seqChar == str.charAt(i) &&
seq.equals(str.substring(i, i + seq.length()))) {
count++;
}
}
return count;
}
public static void main(String args){
String s = "aabbcccddaabbbccc";
System.out.println(count("aa", s)); // 2
// [aa]bbcccddaabbbccc
// aabbcccdd[aa]bbbccc
System.out.println(count("bb", s)); // 3
// aa[bb]cccddaabbbccc
// aabbcccddaa[bb]bccc
// aabbcccddaab[bbccc
System.out.println(count("cc", s)); // 4
// aabb[cc]cddaabbbccc
// aabbc[cc]ddaabbbccc
// aabbcccddaabbb[cc]c
// aabbcccddaabbbc[cc]
}
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
add a comment |
up vote
0
down vote
up vote
0
down vote
Something to consider.. for bbaaarr
are there two sequences of aa
or just one? My solution considers that there are two but it can be easily adjusted for the other case.
Comments in my code to help explain it:
/**
* Returns the number of times the sequence occurs in the string.
* @param seq - the sequence you are looking for
* @param str - the string you are searching in
*/
private static int count(String seq, String str) {
if(seq == null || seq.isEmpty() ||
str == null || str.isEmpty() ){
return 0;
}
int count = 0;
// the first character of the sequence you are looking for
final char seqChar = seq.charAt(0);
// if there aren't seq.length() chars remaining then
// it's no longer possible to match your sequence
// so this is the max index to go to when looking for it
final int maxIndex = str.length() - seq.length();
// iterate through the characters in your string
for (int i = 0; i <= maxIndex; i++) {
// when you find a character matching the start of your sequence
// then compare the substring of equal length to your sequence
// and if it matches then you have a match
if (seqChar == str.charAt(i) &&
seq.equals(str.substring(i, i + seq.length()))) {
count++;
}
}
return count;
}
public static void main(String args){
String s = "aabbcccddaabbbccc";
System.out.println(count("aa", s)); // 2
// [aa]bbcccddaabbbccc
// aabbcccdd[aa]bbbccc
System.out.println(count("bb", s)); // 3
// aa[bb]cccddaabbbccc
// aabbcccddaa[bb]bccc
// aabbcccddaab[bbccc
System.out.println(count("cc", s)); // 4
// aabb[cc]cddaabbbccc
// aabbc[cc]ddaabbbccc
// aabbcccddaabbb[cc]c
// aabbcccddaabbbc[cc]
}
Something to consider.. for bbaaarr
are there two sequences of aa
or just one? My solution considers that there are two but it can be easily adjusted for the other case.
Comments in my code to help explain it:
/**
* Returns the number of times the sequence occurs in the string.
* @param seq - the sequence you are looking for
* @param str - the string you are searching in
*/
private static int count(String seq, String str) {
if(seq == null || seq.isEmpty() ||
str == null || str.isEmpty() ){
return 0;
}
int count = 0;
// the first character of the sequence you are looking for
final char seqChar = seq.charAt(0);
// if there aren't seq.length() chars remaining then
// it's no longer possible to match your sequence
// so this is the max index to go to when looking for it
final int maxIndex = str.length() - seq.length();
// iterate through the characters in your string
for (int i = 0; i <= maxIndex; i++) {
// when you find a character matching the start of your sequence
// then compare the substring of equal length to your sequence
// and if it matches then you have a match
if (seqChar == str.charAt(i) &&
seq.equals(str.substring(i, i + seq.length()))) {
count++;
}
}
return count;
}
public static void main(String args){
String s = "aabbcccddaabbbccc";
System.out.println(count("aa", s)); // 2
// [aa]bbcccddaabbbccc
// aabbcccdd[aa]bbbccc
System.out.println(count("bb", s)); // 3
// aa[bb]cccddaabbbccc
// aabbcccddaa[bb]bccc
// aabbcccddaab[bbccc
System.out.println(count("cc", s)); // 4
// aabb[cc]cddaabbbccc
// aabbc[cc]ddaabbbccc
// aabbcccddaabbb[cc]c
// aabbcccddaabbbc[cc]
}
edited Nov 9 at 13:56
answered Nov 9 at 13:29
xtratic
2,2401822
2,2401822
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
add a comment |
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
Thank you for your code.. But here you have already taken the substring, but I am facing issues in finding substrings only from the array and also the string could be generic. So could you please suggest me a generic code to first find out its substring then its count
– Developer52
Nov 10 at 6:54
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226370%2fhow-to-find-a-substring-in-a-string-and-get-its-count-using-java%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
right now you have infinite loop, because you are not incrementing your
i
in for...– Schidu Luca
Nov 9 at 13:22
is bb=1 or bb=3?
– hunter
Nov 9 at 13:25