比如:aaabbccccccd 这个字符串c连续出现的次数最多
public static void main(String[] args) {
String srcStr = "abcaabbccaaabbbcccddddaaad";
countChar(srcStr).forEach((c, cnt) -> System.out.println(c + "---" + cnt));
//如果只要取出现次数最大的字符和次数,再遍历一次map就行。注意一下是否存在多个字符出现次数一样就行。
}
public static Map<String, Integer> countChar(String srcStr) {
//存放所有字符连续出现的最大次数
Map<String, Integer> maxCntMap = new HashMap<>();
//存放当前字符
String workStr = "";
//存放当前字符连续出现的次数
int workCnt = 0;
String[] srcList = srcStr.split("");
for (String crt : srcList) {
//如果遍历到的字符和上一个字符不同,重设当前字符和当前字符连续出现的次数
if (! workStr.equals(crt)) {
workStr = crt;
workCnt = 0;
}
//当前字符连续出现的次数自增一
workCnt++;
//比较当前字符连续出现的次数和Map中记录的次数,决定是否更新Map中记录的次数
if (maxCntMap.get(crt) == null || maxCntMap.get(crt) < workCnt) {
maxCntMap.put(crt, workCnt);
}
}
return maxCntMap;
}
这样应该说很清晰了。
详见图片,其中使用了guava的Lists,没有guava包,还可以使用new ArrayList(strings);替换
public static void main(String[] args) {
String str = "aaabbccccccd";
List<String> chars = Arrays.asList(str.split(""));
// 去重并得到重复数量
Map<String, Long> countMap = chars.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 排序获取第多的字符
Optional optional = countMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue((o1, o2) -> o2.compareTo(o1)))
.findFirst();
// 省略判空 optional.isPresent()
System.out.println(optional.get());
}
// c=6
str.toCharArray() 得到字符数组
int maxCount = 0, char maxChar = ''
for i的方式循环 int count = 0 如果i为1直接count++ 如果大于1 chars[i-1] = chars[i] count++
当前字符和前个字符不同时 判断count是否大于maxCount 是的话赋值maxCount,maxChar 然后count改为1