使用Java技术解决“统计一个字符串中每个字符出现的次数”问题
Java开发-JavaSE阶段-统计一个字符串中每个字符出现的次数
前言
- 这是一道JavaSE进阶阶段的作业 ;
- 主要利用到的是String,StringBuilder的常用方法进行解决 ;
- 由于本阶段还没有学到集合,IO流等等知识,所以输入采用Scanner ;
源码 (设计思路在文章底部)
/**
* author: CodingPang
* Date: 2022/07/23 19:19
* Description:
* 第16天的作业
* Version: V1.0
*/
public class Day16HomeWork {
// 字符出现次数的统计单独封装成方法,供main方法调用
public void testAppearCounts2() {
// 10、统计一个字符串中每个字符出现的次数
Scanner scanner = new Scanner(System.in);
System.out.print("请输入字符串:");
String str1 = scanner.nextLine();
StringBuilder source = new StringBuilder(str1); // String转换成可变长的StringBuilder,用于删除已经被遍历的重复字符
int count = 0; // 计数
int index = 0; // 被遍历元素的下标
String subStr = "";
while (source.length() != 0) { // 由于每遍历一次,source的长度可能都会变短,要做好安全机制
subStr = source.substring(0, 1); // 每次截取出一个字符(每遍历完一次,都会把遍历的字符给删除,所以下一次都为0开始,截取一个字符长度)
count = 0; // 每次重新循环的时候,count归0
index = 0;
while ((index = source.indexOf(subStr, index)) != -1) { // 找元素下标返回值只要不是-1,都是找得到
count++;
source.deleteCharAt(index); // 删除指定位置的字符,避免后面再次重复遍历
}
System.out.println(subStr + " 出现的次数为:" + count + " 次");
}
}
// main方法调用
public static void main(String[] args) {
Day16HomeWork day16HomeWork = new Day16HomeWork();
day16HomeWork.testAppearCounts2();
}
}
设计与实现思路:
设计思路:
1、统计字符出现的次数,首先让用户通过Scanner在控制台输入字符串;
2、取出这个字符串的每一个字符,然后统计每个字符出现的次数!
实现思路:
1、用户输入字符串后,直接将这个字符串通过StringBuilder的有参构造保存;由于StringBuilder底层并不像String一样是"final char value[];",而是采用“char[] value;”,所以StringBuilder底层的数组长度是可变长的,意味着我们在每次找到字符完毕后,可以将这个字符从StringBuilder中删除,查找下一个字符的时候就是单独下一个字符;
2、String 转换为 StringBuilder:new StringBuilder(放用户输入的字符串);
3、删除StringBuilder中对应的字符:StringBuilder对象.deleteCharAt(下标);
4、通过索引下标在StringBuilder查找指定字符:StringBuilder对象.substring(起始索引, 结束索引) // 注意:结束索引是取不到的,此方法取值范围相当于数学中的左开右闭区间
5、保证每次在这个字符串中的字符都能遍历完才能正确统计次数:采用StringBuilder对象.indexOf(当前被遍历的字符, 索引下标) // 从 “索引下标” 位置开始查找“当前被遍历的字符”在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
6、采用双重while循环,内层负责统计当前被统计字符的次数,每次统计完毕后通过下标删除对应的已经被统计的字符,减少整个StringBuilder对象的长度的同时,保证下一次不会重复统计;外层while循环判断当前StringBuilder对象的长度是否为0,不为0则还有要统计的字符,为0则代表所有的字符已经统计完毕。
总结
第一次写博客,可能有很多不足,比如:目前本题只考虑能够实现功能,并没有考虑到算法的优化!
如果这篇博客对您有帮助,还请多多支持一下;
如果这篇博客有什么不足,还请评论区多多指正或者补充。