题目如下(感兴趣的可以自己先尝试一下):
(字符串去任意网页复制一段话即可)
/*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