繁体   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