前言
这是我学习Java的过程中做的一个作业,按题目要求去做可能有点麻烦,如果可以把后面统计字符重复次数的代码封装成一个方法应该会简便很多。
一、题目/需求
定义一个泛型为String类型的List集合,统计该集合中每个字符(注意,不是字符串)出现的次数。例如:集合中有”abc”、”bcd”两个元素,程序最终输出结果为:“a = 1,b = 2,c = 2,d = 1”。
二、编程思路
先来看流程图,可能有点难看懂:
三、代码
代码如下:
import java.util.*;
public class hwList {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
/*---------------------------- 往ArrayList集合中添加元素 ----------------------------*/
list.add("Java");
list.add("C++");
list.add("Python");
list.add("CSDN");
list.add("IDEA");
/*---------------------------- 处理ArrayList ----------------------------*/
// 将list中的所有字符串拼成一个新的字符串str
String str = list.get(0);
for (int i = 1; i < list.size(); i++) {
str += list.get(i).toLowerCase(); // 转换成小写
//str += list.get(i); // 不转换成小写
}
Map<Character, Integer> charMap = new HashMap<>(); // 将字符和它重复的次数保存到HashMap中
char[] chars = str.toCharArray(); // 将字符串转换成char数组,实现“统计字符出现的次数”
/*---------------------------- 统计字符重复次数 ----------------------------*/
for (int i = 0; i < chars.length; i++) {
// 判断当前字符在字符串中是否重复
if (str.indexOf(chars[i], i) != str.lastIndexOf(chars[i])){ // 如果找到重复
if (!charMap.containsKey(chars[i])){ // 如果某个字符是第一次被发现重复,重复次数为2
charMap.put(chars[i], 2);
}
// 从当前字符往后查找,判断当前字符是否还有重复
else if (str.lastIndexOf(chars[i], str.lastIndexOf(chars[i])) != -1){ // 如果还有重复,次数加一
int v = charMap.get(chars[i]) + 1;
charMap.put(chars[i], v);
}
}
/*for循环中取出最后那个重复的字符的时候,它第一次出现的下标和最后一次出现的下标一样,往后没有重复了,重复的次数不应该加一。
所以如果第一次出现的下标和最后一次出现的下标一样,并且这个字符在字符串中是第一次出现,才说明这个字符没有重复。*/
else if (!charMap.containsKey(chars[i])){
charMap.put(chars[i], 1);
}
}
/*---------------------------- 遍历输出字符及它的重复次数 ----------------------------*/
Set<Map.Entry<Character, Integer>> entries = charMap.entrySet();
for (Map.Entry<Character, Integer> node : entries)
System.out.println(node.getKey() + " = " + node.getValue());
}
}
版权声明:本文为m0_46653786原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。