使用Java技术解决“统计一个字符串中每个字符出现的次数”问题

Java开发-JavaSE阶段-统计一个字符串中每个字符出现的次数

前言

  1. 这是一道JavaSE进阶阶段的作业
  2. 主要利用到的是String,StringBuilder的常用方法进行解决
  3. 由于本阶段还没有学到集合,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则代表所有的字符已经统计完毕。

总结

第一次写博客,可能有很多不足,比如:目前本题只考虑能够实现功能,并没有考虑到算法的优化!
如果这篇博客对您有帮助,还请多多支持一下;
如果这篇博客有什么不足,还请评论区多多指正或者补充。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值