java找出字符串出现最多的字符串_用java找出出现频率最高的,长度为四个字母的字符串...

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

题目:请用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 编辑]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值