![](/img/trans.png)
[英]JAVA: Count each word on a String, and count each letter on the words
[英]Trying to count occurence of each letter in String in Java
我无法正确出现字符串中存在的每个字母。 我的代码有什么问题?
代码:
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);
}
}
map 的 output 应该是:
{a=2, b=2, c=2, d=1}
然而,上面代码给出的 output 是:
{a=1, b=1, c=1, d=1}
使用Map.merge()
你可以不用自己检查这个:
Map<Character, Integer> map = new HashMap<>();
for( char c : A.toCharArray()) {
map.merge(c, 1, Integer::sum);
}
merge()
接受 3 个参数:
Integer::sum
指的是Integer's
方法static int sum(int a, int b)
基本上与您的value + 1
。我会使用以下逻辑:
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");
}
我所做的主要更改是切换到使用Map<Character, Integer>
,因为我们想要跟踪字符键计数,而不是字符串。 此外,我加强了查找逻辑以将初始计数设置为零,以防出现新字母,或 map 中的先前值,以防字母已知。
更通用的解决方案是使用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);
}
如果您只有英文字母,则解决方案可能更有效 memory :
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]);
}
问题似乎出在这一行map.put(String.valueOf(A.charAt(i)),i+1)
中,每次发现字符重复时都会重置计数。 如果重复出现,您需要获取字符的先前计数。 尝试将行更改为map.put(String.valueOf(A.charAt(i)),map.get(String.valueOf(A.charAt(i)))+1)
。
您也可以在HashMap
object 中直接使用Character
作为键,这将使代码更简单。 希望以下代码对您有所帮助:
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}
它不起作用的原因是您正在放置一个 String 类型的键,并且您正在尝试使用字符值。 解决该错误的最快方法是将 get 更改为
map.get(String.valueOf(A.charAt(i)))
另一种检查键是否不存在的方法是使用 contains 方法。
map.containsKey(String.valueOf(A.charAt(i)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.