我感觉还是用集合要方便一些。
题目:请用java找出出现频率最高的,长度为四个字母的字符串。
我感觉,应该这么做:
第一步,找出所有的子串。
第二步,统计每个子串的出现次数。
第三步,找出出现次数最多的那个子串。
我的理解,所谓的子串,就是存在于主串中的,n个连续的字符。比如,字符串abcd所有长度为2的子串是:ab、bc、cd 。
各位,毋庸置疑,此时需要使用Map<String,Integer>了吧? 还有,我现学现用,在咱们论坛看各位写的Map按value排序的方法。
范例1:废话少说。[code=java]package org.cxy.demo;
import java.util.*;
import java.util.Map.*;
public class SubString {
private String str;
private Map<String,Integer> map ;
/**
* 初始化用户指定的参数串。
* */
public SubString(String str){
this.str = str;
}
/**
* 功能:指定子串长度,取得str的所有子串,计算每个子串出现的次数。
* @param len 子串的长度。
* */
public Map<String,Integer> getSubstringByLength(int len){
this.map = new HashMap<String,Integer>();
for(int i=0;i<this.str.length()-len+1;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<String, Integer> getMaxCountByLength(int len){
if(this.map == null){
// 先查询出str的所有子串。
this.getSubstringByLength(len);
}
// 您懂的。
Set<Map.Entry<String,Integer>> set = this.map.entrySet();
// 返回出现次数最多的那个子串。
return Collections.max(set, new Comparator<Map.Entry<String, Integer>>(){
public int compare(Entry<String, Integer> a1,Entry<String, Integer> 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<Map.Entry<String,Integer>> set = sub.getSubstringByLength(len).entrySet();
for(Map.Entry<String, Integer> temp : set){
System.out.printf("子串 = %s , 出现次数 = %d\n", temp.getKey(),temp.getValue());
}
Map.Entry<String, Integer> 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 编辑 ] |