注:方法有多个这里只是其中一中。
1.解题思路
(1)引入TreeSet,通过集合找出所有出现的字符串
(2)引入ArrayList:快速排序,在通过StringBuffer生成排序后的字符串
(3)通过String API中的indexOf()找出第一次出现的下标,lastIndexOf最后一次出现的下标求出其长度。
(4)记录第一个出现次数最多的字符(为了计算多个字符相同的情况)
(5)求出的字符串放入集合中存储
2.代码
public class Demo3 {
public void doString(String input){
char[] chars=input.toCharArray();//char类型数组
ArrayList<String> lists=new ArrayList<String>();
TreeSet<String> set=new TreeSet<String>();
for (int i = 0; i < chars.length; i++) {
lists.add(String.valueOf(chars[i]));
set.add(String.valueOf(chars[i]));
}
Collections.sort(lists);
System.out.println(lists);
System.out.println(set);
StringBuffer sb=new StringBuffer();
for (int i = 0; i < lists.size(); i++) {
sb.append(lists.get(i));
}
String input1 = sb.toString(); //排序后的字符串
String input2 = lists.toString();//直接liststoString是不行的我们可以看后面的下标打印情况
System.out.println(input1);
int max=0; // 记录最大的数
String maxString="";
ArrayList<String> maxList=new ArrayList<String>(); // 存储最大的字符串
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String str = iterator.next();// 迭代器迭代每个不重复的字符
System.out.println("---------这是lists直接toString的下标------------");
System.out.println(input2.indexOf(str));
int begin = input1.indexOf(str);
int end = input1.lastIndexOf(str);
int length=end-begin+1;
if(length>max){
max=length;
maxString=str; //去重复因为我们只需要匹配最大的字符
maxList.add(str);
}
else if(length==max){
maxList.add(str);
}
}
int index=0;
for (int i = 0; i < maxList.size(); i++) {
if(maxList.get(i).equals(maxString)){
index=i;
break;
}
}
System.out.println("出现次数最多的为");
for (int i = index; i < maxList.size(); i++) {
System.out.println(maxList.get(i)+"出现"+max);
}
}
public static void main(String[] args) {
new Demo3().doString("dsdsadaa");
}
3.运行结果
4.为什么直接list直接toString不行呢?因为我们从他的源码可以看出作为字符串的方法他是包含了括号和“,”以及空格的所以输出的下标为1 ,10 ,19(每个字母第一次出现的下标)