HashMap实现类——循环添加键值对

要求:在控制台输入一句英语, 获得每个字母出现的次数,(PS)每个字符作为key,出现的次数作为value

这里使用两种方式进行操作,两种方式都需要将字符串转为字符数组,循环遍历操作:

  • 一种方式一次循环遍历添加【墙裂推荐】,利用【map.get(key)】方法调取value值,直接进行判断,如果为null,说明该字符第一次出现,则直接将count计数为1,如果不是null,则直接count++,最后输出集合结果,时间复杂度是O(n)。

  • 另一种方式就是两次循环遍历,外层循环抽取字符,内层循环将该字符与所有字符进行遍历比对,得到次数,最后输出集合结果,时间复杂度是O(n2)。

public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一句英语:");
        String str  = sc.nextLine();

		//正则表达式,将除去字母的所有字符作为切割点,切割为多个字符串
        String[] strs = str.split("[^a-zA-Z]+"); 
        //将切割的字符串数组重新拼接为字符串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < strs.length; i++) {
            sb.append(strs[i]);
        }
        str = sb.toString();
        numOfLetter1(str);	//调用第一种O(n)时间复杂度算法
        numOfLetter2(str);	//调用第二种O(n^2)的时间复杂度算法
    }
	
	/**
	*第一种O(n)时间复杂度算法的封装函数
	*/
    public static void numOfLetter1(String str) {
        HashMap<Character, Integer> cases = new HashMap<>();
        for (int i = 0; i < str.length(); i++) {
        	//通过遍历到的字符作为键值获取对应的value值,并保存到count,这里注意必须是Integer类型
            Integer count = cases.get(str.charAt(i));
            if (null == count) {	//如果为null,表明该字符未曾出现,则直接将count计数为1
                count = 1;
            } else {	//否则,直接累加,结果就是该字符出现的总次数
                count++;
            }
            cases.put(str.charAt(i), count);	//map集合添加
        }
        //map集合entrySet()方式遍历输出
        Set<Map.Entry<Character, Integer>> entryCases = cases.entrySet();
        for (Map.Entry<Character, Integer> entryCase : entryCases) {
            System.out.println(entryCase);
        }
    }

    public static void numOfLetter2(String str){
        HashMap<Character, Integer> cases = new HashMap<>();
        for (int i = 0; i < str.length(); i++) {
        	//外层循环依次抓取字符
            int count = 0;

			//内层循环依次与该字符比对,计算出现次数
            for (int j = 0; j < str.length(); j++) {
                if (str.charAt(i) == str.charAt(j)) {
                    count++;
                }
            }
            //将结果添加到map集合
            cases.put(str.charAt(i), count);
        }
        //map集合增强for循环方式遍历集合
        for (Character character : cases.keySet()) {
            System.out.println(character + "=" + cases.get(character));
        }
    }
}

你可能感兴趣的:(Java之集合)