大数据Java高频面试题之一:利用集合类处理字符串,统计文字、字母、单词出现的频率及延伸 详解【一看就懂】

大数据Java高频面试题之一:利用集合类处理字符串,统计文字、字母、单词出现的频率及延伸 详解【一看就懂】,第1张

大数据/Java高频面试题之一:利用集合类处理字符串,统计文字、字母、单词出现的频率及延伸 详解【一看就懂】

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

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

 

 我用的字符串

 上代码

//第一问:自定义一个结构,利用合适的集合类统计字符出现的次数( 结构定义合理,拆分字符,统计)。
//自定义一个结构,利用合适的集合类统计字符出现的次数
HashMap 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 characters = map.keySet();
        for (Character character : characters) {
            System.out.println(character + " 出现了" + map.get(character) + "次");
        }

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

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

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

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

 HashMap 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> iterator2 = mapEng.entrySet().iterator();
        while (iterator2.hasNext()) {
            Map.Entry 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 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> iterator = wordMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry next = iterator.next();
            //如果value的值大于3,则说明该单词出现了3次以上,输出到控制台
            if (next.getValue() > 3) {
                //输出到控制台
                System.out.println("单词 " + next.getKey() + " 出现了" + next.getValue() + "次");
            }
        }

展示结果:


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

Respect

Thanks  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4685824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存