怎么统计字符串中a、b、c三个字符的个数

import javax.swing.JOptionPane;
public class Test {
public static void main(String args[]) {
String upper = JOptionPane.showInputDialog(null, "输入文本");
System.out.println(upperStrToLowerStr(upper));

}

public static String upperStrToLowerStr(String upper) {
String lower = "";
for (int i = 0; i < upper.length(); i++) {
lower += upperCaseToLowerCase(upper.charAt(i));
}
return lower;
}

public static char upperCaseToLowerCase(char ch) {

if (ch >= 'A' && ch <= 'Z') {
ch = (char) (ch +32); } //将大写字母转换成小写字母
else
if (ch >= 'a' && ch <= 'z') {
ch = (char) (ch -32); } //将小写字母转换成大写字母
return ch;
}
public static int test(String src, String ch) {
return (src.length() - src.replace(ch, "").length()) / ch.length();
}

}

推荐用java8的stream来进行有关集合数据统计问题

由题意得到的

输入:一个字符串str

输出:统计这个字符串按str中a,b,c出现的次数

但是这里并没有说区分大小写,所以代码里做了一下控制

参考代码如下(请用java8环境运行):

public static void main(String[] args) {
    String s = "asdf12fdfdsaAcAaascdbashcdas";
    Boolean isIgnoreCase = false;
    Map<String, Long> map = countNum(s, isIgnoreCase);
    System.out.println(map);
}

public static Map<String, Long> countNum(String str, Boolean isIgnoreCase) {
    Map<String, Long> map = Pattern.compile("").splitAsStream(str)
            .map(item -> isIgnoreCase ? item.toLowerCase() : item)
            .collect(Collectors.groupingBy(item -> item, Collectors.counting()));
    return map;
}

解释一下:

s字符串就是要解析的字符串

isIgnoreCase 就是是否要忽略大小写,false的话表示不忽略,那A和a就算分别统计算一次,true的话,表示要忽略,那A和a就应该算两次


Pattern.compile("").splitAsStream(str): 把字符串str按照空字符串分割,其实就是把字符串中每个字符取出来组合成一个stream

map(item -> isIgnoreCase ? item.toLowerCase() : item):把其中每个字符映射,映射规则是要进行判断若isIgnoreCase为true,即忽略大小写,那字符都转化为小写,若不忽略,则用原来的字符即可

collect(Collectors.groupingBy(item -> item, Collectors.counting())):转化后,按照各自出现的字符进行统计,统计其中的次数


运行后最后把map打印一下就非常清楚了

isIgnoreCase 为false,不区分大小写


isIgnoreCase 为true,区分大小写,此时统计结果中无A的统计


最后直接再map中get("a")或者get("b"),把统计结果取出来即可

温馨提示:答案为网友推荐,仅供参考
相似回答