求出现最多的字符串和次数,如有多个全部输出

注:方法有多个这里只是其中一中。

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(每个字母第一次出现的下标)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值