【详解】利用集合类处理字符串,统计文字、字母、单词出现的频率及延伸

 题目如下(感兴趣的可以自己先尝试一下):

(字符串去任意网页复制一段话即可)

/*1、自定义一个结构,利用合适的集合类统计字符出现的次数( 结构定义合理,拆分字符,统计)。
2、至少使用两种遍历方式打印每个字符出现的次数。
3、统计每个字母出现的次数。然后遍历打印。
4、打印出现次数超过3次的单词(大小写不敏感)(敏感处理,3次的判断)。*/

 我用的字符串

 上代码

//第一问:自定义一个结构,利用合适的集合类统计字符出现的次数( 结构定义合理,拆分字符,统计)。
//自定义一个结构,利用合适的集合类统计字符出现的次数
HashMap<Character, Integer> map = new HashMap<>();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int x = 1;
            //遍历时判断,如果map容器中已经包含key的值,则调用map.put方法覆盖原有的键,value值+1
            if (map.containsKey(chars[i])) {
                map.put(chars[i], map.get(chars[i]) + 1);
            } else {
                //否则,存入一个新的值进去,value值为x 即1
                map.put(chars[i], x);
            }
        }
        //打印map集合验证
        System.out.println(map);

结果验证: (直接打印map集合查看效果)

/ / 第二问:至少使用两种遍历方式打印每个字符出现的次数

        这里顺便展示了map容器遍历的三种方式:        

        //方式一:keySet获取所有key的值再进行遍历
        Set<Character> characters = map.keySet();
        for (Character character : characters) {
            System.out.println(character + " 出现了" + map.get(character) + "次");
        }

        //方式二:entrySet,灵活性最强,想获得什么就获得什么
        Set<Map.Entry<Character, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<Character, Integer>> iterator = entries.iterator();
        //利用迭代器的hasNext()方法判断是否有下一个元素
        while (iterator.hasNext()) {
            Map.Entry<Character, Integer> next = iterator.next();
            System.out.println(next.getKey() + " 出现了" + next.getValue() + "次");
        }

        //方式三:values,只能获取值
        Collection<Integer> values = map.values();
        Iterator<Integer> iterator1 = values.iterator();
        while (iterator1.hasNext()) {
            Integer next = iterator1.next();
            System.out.println(next);
        }

 这里就不展示每种方式遍历的结果了,过于冗长,感兴趣的小伙伴可以自己运行查看效果

/ /第三问:统计每个字母出现的次数。然后遍历打印

 HashMap<Character, Integer> mapEng = new HashMap<>();//新建一个map集合用于存放字母及对应的次数
        String[] split = str.split("");
        for (int i = 0; i < split.length; i++) {
            String regEng = "^[a-zA-Z]$";//此处正则验证是否匹配字母 ^表示开始 $表示结束
            if (split[i].matches(regEng)) {//字符串的matches方法用于匹配正则表达式
                //以下代码同上文,就不做详细注释啦
                int x = 1;
                if (mapEng.containsKey(chars[i])) {
                    mapEng.put(chars[i], mapEng.get(chars[i]) + 1);
                } else {
                    mapEng.put(chars[i], x);
                }
            }
        }
        //利用entry映射调用迭代器来获取key和value
        Iterator<Map.Entry<Character, Integer>> iterator2 = mapEng.entrySet().iterator();
        while (iterator2.hasNext()) {
            Map.Entry<Character, Integer> next = iterator2.next();
            System.out.println("单词 " + next.getKey() + " 出现了" + next.getValue() + "次");
        }

 结果验证: 

 / /第四问:打印出现次数超过3次的单词(大小写不敏感)

 String regWord = "[^a-zA-Z]+";//反向字符集。匹配未包含的任何字符。例如"[^abc]"匹配"plain"中"p","l","i","n"。
        String[] split = str.split(regWord);//以该正则切割字符串,匹配到的所有即为英文单词
        HashMap<String, Integer> wordMap = new HashMap<>();//新建hashMap集合,用于存放单词及对应次数
        for (int i = 0; i < split.length; i++) {
            split[i] = split[i].toLowerCase();//大小写不敏感处理
            //如果map集合中已经包含字符串数组中的值,则覆盖之前的值,获取之前的value加一并重新存入对应的key值
            if (wordMap.containsKey(split[i])) {
                wordMap.put(split[i], wordMap.get(split[i]) + 1);
            } else {
                //否则则说明该单词第一次出现,存入map集合中,value为次数即1
                wordMap.put(split[i], 1);
            }
        }

        //利用entry映射调用迭代器来获取key和value
        Iterator<Map.Entry<String, Integer>> iterator = wordMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> next = iterator.next();
            //如果value的值大于3,则说明该单词出现了3次以上,输出到控制台
            if (next.getValue() > 3) {
                //输出到控制台
                System.out.println("单词 " + next.getKey() + " 出现了" + next.getValue() + "次");
            }
        }

展示结果:


 以上即为该题的详解及过程,如有问题欢迎留言互动~

Respect

Thanks  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hah杨大仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值