统计字符串中出现最多的字母及其次数
鉴于javaeye的强大资源,本人在泡论坛之余,学习到两种方法,特拿上来予以分享。
由于有参考javaeye资料,具体链接已忘记了 - -! 如有侵权,请告知。
现有两种方式求解:
方法一: 利用数据结构map来求解。
public static void main(String[] args) {
Map<String, Long> charTimes = new HashMap<String, Long>();
String str = "aaaaabb";
//遍历字符数组
for (char each : str.toCharArray()) {
if ((each >= 65 && each <= 90) || (each >= 97 && each <= 122)) {//是否为数字
String charStr = String.valueOf(each);
if (charTimes.containsKey(charStr)) {
Long num = charTimes.get(charStr).longValue() + 1;
charTimes.put(charStr, num);
} else {
charTimes.put(charStr, 1L);
}
}
}
String maxAppearChar = null;
Long maxAppearTimes = 0L;
//遍历map
for (Map.Entry<String, Long> charAppear : charTimes.entrySet()) {
if (charAppear.getValue() > maxAppearTimes) {
maxAppearChar = charAppear.getKey();
maxAppearTimes = charAppear.getValue();
}
}
System.out.println("出现最多的字母:" + maxAppearChar);
System.out.println("出现次数:" + maxAppearTimes);
}
方法2: 采用数组来求解, 其时间复杂度相对于map来说要高一点。
/**
* 统计字符串中出现最多的字母及其次数
* @author gogole_09
*
*/
public class CountChar {
private int[] charCount = new int[26]; // 保存字母出现的次数,初步只统计26个字母(都转换成小写字母),
/**
* 统计字母出现次数
*
* @param str
*/
private void countChar(String str) {
str = str.toLowerCase();
// 字母a-z的索引
for (char chari = 'a'; chari <= (char) ('a' + 25); chari++) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (chari == ch) {
charCount[chari - 'a']++;
}
}
}
}
/**
* 计算出现最多的字母
* @return
*/
private char getMaxChar() {
char max = '?';
int maxcount = 0;
for (char chari = 'a'; chari <= (char) ('a' + 25); chari++) {
if (charCount[chari - 'a'] >= maxcount) {
maxcount = charCount[chari - 'a'];
max = chari;
}
}
return max;
}
/**
* 获取出现最多的字母出现的具体次数
* @return
*/
private int getMaxCount(){
return getMaxChar()=='?'?charCount[getMaxChar()-'a']:-1;
}
public static void main(String[] args) {
String str="aaabab";
CountChar c=new CountChar();
c.countChar(str);
System.out.println(str+":中出现次数最多的字母是:");
System.out.println(c.getMaxChar());
System.out.println("出现次数是:");
System.out.println(c.getMaxCount());
}
}
当然,此问题还有未考虑周全之处, 如发现有相同的最大值,该如何处理 【aabb】时。望大家集思广义,来拍拍砖.