![](/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.