我感觉还是用集合要方便一些。

题目:请用java找出出现频率最高的,长度为四个字母的字符串。

我感觉,应该这么做:

第一步,找出所有的子串。

第二步,统计每个子串的出现次数。

第三步,找出出现次数最多的那个子串。

我的理解,所谓的子串,就是存在于主串中的,n个连续的字符。比如,字符串abcd所有长度为2的子串是:ab、bc、cd 。

各位,毋庸置疑,此时需要使用Map了吧? 还有,我现学现用,在咱们论坛看各位写的Map按value排序的方法。

范例1:废话少说。[code=java]package org.cxy.demo;

import java.util.*;
import java.util.Map.*;
public class SubString {
private String str;
private Map map ;
/**
*   初始化用户指定的参数串。
* */
public SubString(String str){
this.str = str;
}
/**
*   功能:指定子串长度,取得str的所有子串,计算每个子串出现的次数。
*   @param len 子串的长度。
* */
public Map getSubstringByLength(int len){
this.map = new HashMap();
for(int i=0;i
String temp = this.str.substring(i,i+len);
// 若已经存在了这个子串。
if(map.containsKey(temp)){
map.put(temp, map.get(temp)+1);
}else{
map.put(temp, 1);
}
}
return map;
}
/**
*   功能:指定子串长度,取得str的所有子串中,出现的次数最多的那个子串。
*   @param len 子串的长度。
* */
public Map.Entry getMaxCountByLength(int len){
if(this.map == null){
// 先查询出str的所有子串。
this.getSubstringByLength(len);
}
// 您懂的。
Set> set = this.map.entrySet();
// 返回出现次数最多的那个子串。
return Collections.max(set, new Comparator>(){
public int compare(Entry a1,Entry a2) {
// 按子串出现的次数,从小到达排序。
return a1.getValue() - a2.getValue();
}
});
}
public static void main(String[] args){
SubString sub = new SubString("aaaafdfefesvfefefe");
int len = 4;
System.out.printf("所有长度为 %d 的子串的信息如下:\n",len);
Set> set = sub.getSubstringByLength(len).entrySet();
for(Map.Entry temp : set){
System.out.printf("子串 = %s , 出现次数 = %d\n", temp.getKey(),temp.getValue());
}
Map.Entry entry =         sub.getMaxCountByLength(len);
System.out.println("出现次数最多的子串:key = "+entry.getKey()+",value="+entry.getValue());
}

}[/code]程序执行结果:[code=java]所有长度为 4 的子串的信息如下:

子串 = aafd , 出现次数 = 1

子串 = afdf , 出现次数 = 1

子串 = efef , 出现次数 = 1

子串 = efes , 出现次数 = 1

子串 = svfe , 出现次数 = 1

子串 = fesv , 出现次数 = 1

子串 = dfef , 出现次数 = 1

子串 = aaaf , 出现次数 = 1

子串 = aaaa , 出现次数 = 1

子串 = fdfe , 出现次数 = 1

子串 = fefe , 出现次数 = 3

子串 = vfef , 出现次数 = 1

子串 = esvf , 出现次数 = 1

出现次数最多的子串:key = fefe,value=3[/code]程序使用的HashMap存储数据,因此,数据的输出顺序和数据的插入顺序,是不一样的。

程序中还有一个问题,字符串“fefefe” 中,是出现了一个fefe呢,还是2个fefe呢。在上面的范例中,认为这个字符串中包含了2个fefe。

验证程序结果是否正确,也十分简单,把咱们的字符串复制到记事本内,然后把光标设置到文件的最开头,接着输入ctrl+f 。然后 ,您懂的。  记事本认为“fefefe”中只有1个“fefe” 。 其实,这个问题很好解决。 写过或学习过kmp算法的人,都懂的。

[本帖最后由 崔虎 于 2011-07-27  14:28 编辑]