Reputation: 33
I am not able to get the correct occurrence of each letter present in the string. What is wrong with my code?
Code:
public class consecutiveCharacters {
public static String solve(String A, int B) {
HashMap<String, Integer> map = new HashMap<>();
for (int i=0;i<A.length();i++) {
Integer value = map.get(A.charAt(i));
if(value == null){
map.put(String.valueOf(A.charAt(i)),1);
}
else {
map.put(String.valueOf(A.charAt(i)),i+1);
}
}
System.out.println(map);
String text = "i feel good";
return text;
}
public static void main(String[] args) {
solve("aabbccd",2);
}
}
The output of the map should be:
{a=2, b=2, c=2, d=1}
Yet the output that the above code is giving is:
{a=1, b=1, c=1, d=1}
Upvotes: 0
Views: 800
Reputation: 808
Simple as this:
String s = "aabbcd";
Map<Character, Integer> map = new HashMap<>();
for (var c: s.toCharArray()){
map.put(c, (int)Arrays.stream(s.chars().toArray()).filter((i)->i == c).count());
}
Output: {a=2, b=2, c=1, d=1}
Upvotes: 0
Reputation: 61
Try this using getOrDefault instead of checking if the map contains the key:
Map<Character, Integer> map = new HashMap<>();
for(char c: A.toCharArray()){
map.put(c, map.getOrDefault(c, 0) + 1);
}
Upvotes: 0
Reputation: 187
The reason why it is not working is that you are putting a key of type String and you are trying to get using a character value. The fastest way to solve the bug would be to change the get to
map.get(String.valueOf(A.charAt(i)))
Another way to do a check if a key does not exist is to use the contains method.
map.containsKey(String.valueOf(A.charAt(i)))
Upvotes: 0
Reputation: 320
The problem seems to be in this line map.put(String.valueOf(A.charAt(i)),i+1)
where it is resetting the count every time it found a recurrence of a character. You need to get the previous count of a character if it recurred. Try changing the line to map.put(String.valueOf(A.charAt(i)),map.get(String.valueOf(A.charAt(i)))+1)
.
Also you can use Character
directly as the key in your HashMap
object, which will make the code much simpler. Hope the following code will be helpful:
public static String solve(String A, int B) {
HashMap<Character, Integer> count = new HashMap<>();
for(Character ch: A.toCharArray()){
if(count.containsKey(ch) == false){
count.put(ch, 0);
}
count.put(ch, count.get(ch)+1);
}
System.out.println(count);
String text = "i feel good";
return text;
}
// A = "aabbccd"
// count = {a=2, b=2, c=2, d=1}
Upvotes: 0
Reputation: 18245
A more generic solution is to use Map<Character, Integer>
:
public static void solve(String str) {
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < str.length(); i++) {
char ch = Character.toLowerCase(str.charAt(i));
map.merge(ch, 1, Integer::sum);
}
System.out.println(map);
}
In case you have only English letter, then solution could be more memory effective:
public static void solve(String str) {
str = str.toLowerCase();
int[] letters = new int[26];
for (int i = 0; i < str.length(); i++)
letters[str.charAt(i) - 'a']++;
for (int i = 0; i < letters.length; i++)
if (letters[i] > 0)
System.out.format("%c=%d\n", 'a' + i, letters[i]);
}
Upvotes: 0
Reputation: 88707
Using Map.merge()
you can rid of checking this yourself:
Map<Character, Integer> map = new HashMap<>();
for( char c : A.toCharArray()) {
map.merge(c, 1, Integer::sum);
}
merge()
takes 3 parameters:
Integer::sum
refers to Integer's
method static int sum(int a, int b)
which basically is the same as your value + 1
.Upvotes: 3
Reputation: 520958
I would use the following logic:
public static void solve(String A) {
Map<Character, Integer> map = new HashMap<>();
for (int i=0; i < A.length(); i++) {
char letter = A.charAt(i);
int count = map.get(letter) != null ? map.get(letter) : 0;
map.put(letter, ++count);
}
System.out.println(map); // prints {a=2, b=2, c=2, d=1}
}
public static void main(String[] args) {
solve("aabbccd");
}
The main changes I made were to switch to using a Map<Character, Integer>
, since we want to keep track of character key counts, rather than strings. In addition, I tightened the lookup logic to set the initial count at either zero, in case a new letter comes along, or the previous value in the map, in case the letter be already known.
Upvotes: 1