假设现在有一个很长的字符串(只包括英文字母),现在需要统计长字符串中每个字母字符出现的次数。
暂时想出以下两种方法:
package com.sphere.letters; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * 统计长字符串中每个字母字符出现的次数(区分大小写) * 并以 <字符,出现次数> 的键值对形式返回 */ public class Test { private static String TEST = "AWQEYIOAHDHDKKLDLAHFHJALAFHANNAFGJCXCKBZCQIEO" + "PADHAZBZVCFGCSHDJCKCLDMDHFAKAIIAYQO"; public static void main(String[] args) { getMapByArray(TEST); } private static HashMap<Character, Integer> getMapByArray(String str){ char[] array = str.toCharArray(); List<Character> list = new ArrayList<Character>(); HashMap<Character, Integer> map = new HashMap<Character, Integer>(); for (int i = 0; i < array.length; i++) { list.add(array[i]); } //循环对比 假定没有一个重复的元素 则循环基数为size() int length = list.size(); while(length > 0){ //某个字符出现的次数 list首个元素不再比较之列 int count = 1; for (int i = 1; i < length; i++) { //每次拿list的第一个字符 与之后的所有字符对比 if(0 == list.get(0).compareTo(list.get(i))){ //存在相同的就从list中移除 //并且长度减1,出现次数加1, //i减1,下次还从此索引检测,以防连续字母出现时跳过的情况 list.remove(i); length--; count++; i--; } } //移除第一个字符 map.put(list.get(0), count); list.remove(0); length--; /**************FOR TEST******************* for (Character ch : list) { System.out.print(ch); } System.out.println(); System.out.println("元素个数:"+list.size()); **************FOR TEST*******************/ } System.out.println(map); return map; } }
也可以利用26个英文字母的特殊性得到字母出现的次数
我们可以建立一个 int[] array = new int[26] 的数组,
英文字母具有特殊性 字母对应ASCII编码中的某个值
以字母A或者a为基数 将每个字符和A或者a相减,并将对应位置的值加1
private static int[] array = new int[26];
//英文字母具有特殊性 字母对应ASCII编码中的某个值 //以字母A或者a为基数 将每个字符和A或者a相减 private static void getCharCountsByASCII(String str){ char temp ; for (int i = 0; i < str.length(); i++) { temp = str.charAt(i); if(temp >= 'A' && temp <='Z'){ array[temp - 'A']++; }else if(temp >= 'a' && temp <='z') { array[temp - 'a']++; }else { } } /**************FOR TEST*******************/ for (int i = 0; i < array.length; i++) { System.out.print(array[i]+" "); } /**************FOR TEST*******************/ }
感觉这两种方法效率都不是很高,哪位有更好的办法还请留言告知一下,谢谢。