簡體   English   中英

試圖計算 Java 中字符串中每個字母的出現次數

[英]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 個參數:

  • 一個鍵,它是您案例中的字符
  • 為鍵輸入的值,在您的情況下為 1
  • 如果條目已經存在,則合並雙功能以組合新值和現有值。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM