您的位置:首页 > 其它

求包含a~z中多个字符的字符串中重复出现最多的字母及次数问题

2017-08-31 21:22 459 查看
问题: 一个字符串中可能包含a~z中的多个字符(有重复),如String data = "dkiekdadlidaakakkdkdkd",
 求出现次数最多的那个字母及次数,如有多个最多重复的字母,则都求出。

思路:

1、将字符串变为字符数组; 

2、将字符数组中字符放入set集合中去重,剩下的就是在字符串中出现的字母;

3、将字符放入list集合中,排序,然后在转为字符串;

4、遍历set集合,根据set集合中的字母,使用String类的indexOf()和lastIndexOf()方法,

      得到各个字母在排序后的字符串中出现的第一个位置和最后一个位置,差值得到出现的次数, 

        a)记录最大的出现次数,
b)将所有字母和对应的出现次数放入map集合中;

5、遍历map集合,根据记录的最大出现次数,得到最大出现次数对应的字母,放入maxlist集合中;

6、遍历maxlist集合,得到最大出现次数的所有字母。

下面直接贴上代码:

public static void main(String[] args) {
String str = "aakaakddccadldaklaaidkkeikdkdkds";
getRepeatCharAndNum(str);
}

/**
* 一个字符串中可能包含a~z中的多个字符(有重复),如String data = "dkiekdadlidaakakkdkdkd",
* 求出现次数最多的那个字母及次数,如有多个最多重复的字母,则都求出。
*/
public static void getRepeatCharAndNum(String str) {
/**
* 思路: 1、将字符串变为字符数组; 2、将字母放入set集合中去重,剩下的就是在字符串中出现的字母;
* 3、将字母放入list集合中,排序,然后在转为字符串;
* 4、遍历set集合,根据set集合中的字母,使用String类的indexOf()和lastIndexOf()方法,
* 得到各个字母在排序后的字符串中出现的第一个位置和最后一个位置,差值得到出现的次数, a)记录最大的出现次数,
* b)将所有字母和对应的出现次数放入map集合中;
* 5、遍历map集合,根据记录的最大出现次数,得到最大出现次数对应的字母,放入maxlist集合中;
* 6、遍历maxlist集合,得到最大出现次数的所有字母
*/

// 将字符串转换为char数组
char[] chars = str.toCharArray();

// 得到去除重复字母的set集合
TreeSet<String> set = getTreeSetByChars(chars);

// 获得排序后的集合
List<String> sortList = getSortList(chars);

// 将排序后的集合转为字符串
str = getSortString(sortList);

int max = 0;// 出现最多的字母的次数

Map<String, Integer> map = new HashMap<String, Integer>();
// 遍历set集合,查看各个字母分别出现的次数,将数据存入map集合中,key为字母,value为次数
Iterator<String> its = set.iterator();
while (its.hasNext()) {
String os = (String) its.next();
int begin = str.indexOf(os);// 获得重复字母中第一个的位置
int end = str.lastIndexOf(os);// 获得重复字母中最后一个的位置
int value = end - begin + 1;// 差值就是重复字母的个数
map.put(os, value);// 将重复字母和出现次数,放入map中
if (value > max) {
max = value;// 将目前出现的最大次数赋值给max变量
}
}

//存放出现最多次的字母的集合
ArrayList<String> maxList = getMaxAppearChar(map, max);

//打印出现次数最多的字母及个数
printMaxAppearChar(max ,maxList) ;

}

/**
* 遍历将重复出现次数最多的字母遍历出来
*/
private static void printMaxAppearChar(int max, ArrayList<String> maxList) {
System.out.println("最大的数据重复是 :" + max);
System.out.println(" 最大的数据是:");
for (int i = 0; i < maxList.size(); i++) {
System.out.print(maxList.get(i) + " ");
}
}

/**
* 存放出现最多次的字母的集合
*/
private static ArrayList<String> getMaxAppearChar(Map<String, Integer> map,
int max) {
ArrayList<String> maxList = new ArrayList<String>();
for (String key : map.keySet()) {
System.out.println("key = " + key + " value = " + map.get(key));
if (max == map.get(key)) {
maxList.add(key);// 最大出现次数的字母
}
}
return maxList;
}

/**
* 将排序后的list集合数据放入字符串中
**/
private static String getSortString(List<String> sortList) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < sortList.size(); i++) {
buffer.append(sortList.get(i));
}
String str = buffer.toString();
System.out.println(str);
return str;
}

/**
* 获得排序后的集合
*
* @param chars
* @return
*/
private static List<String> getSortList(char[] chars) {
// list集合
ArrayList<String> lists = new ArrayList<String>();
for (int i = 0; i < chars.length; i++) {
lists.add(String.valueOf(chars[i]));
}
// 将lists集合排序
Collections.sort(lists);
System.out.println(lists);

return lists;
}

/**
* 根据chars字符数组获得TreeSet集合,将重复字母去重
*/
private static TreeSet<String> getTreeSetByChars(char[] chars) {
TreeSet<String> set = new TreeSet<String>();// set集合,去重
for (int i = 0; i < chars.length; i++) {
set.add(String.valueOf(chars[i]));
}
System.out.println(set);// 去重后的set集合中是重复出现的字符
return set;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐