黑马程序员-----String类(练习)

package cn.itcast.p1.string.demo;
/*
 * 对字符串数组中的字符串进行排序
 *  String [] arr = {"abc","aba","abb","zzz","xxx","hhh"}; 
 *  
 *  思路:1,用做比较,对数组进行遍历打印
 *  	2,对字符串数组排序,排序可以使用冒泡排序法。
 *  		难点:字符串是对象,应该用对象的比较方法 compareTo()
 * 
 */
public class StringTest {

	public static void main(String[] args) {
		
		String [] arr = {"abc","aba","abb","zzz","xxx","hhh"}; 
		
		printArray(arr);
		
		sortArray(arr);
		
		printArray(arr);
		
		
	}

	//冒泡排序法
	public static void sortArray(String[] arr) {
		
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = i+1; j < arr.length; j++) {
				
				if(arr[i].compareTo(arr[j]) > 0)
					swap(arr,i,j); //传进去一个数组,交换
					
				
					
				
			}
		}
	}

	private static void swap(String[] arr, int i, int j) {
		
		String temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	public static void printArray(String[] arr) {
		
		System.out.print("[");   //为了输出好看
		for (int i = 0; i < arr.length; i++) {
			if(!(i==arr.length-1))
			System.out.print(arr[i]+",");
			else
				System.out.println(arr[i]+"]"); 
				
			
		}
	}

}
 



package cn.itcast.p1.string.demo;

/*
 * 获取一串字符中的子串出现的次数
 * "nbaasdnbaiinbaohnnbapwnba"
 * 用indexOf找到对应的字符串角标,找到后就计数
 * 
 */
public class stringTest_1 {

	public static void main(String[] args) {
		
		//不用多说,先搞个字符串对象
		String str = "nbaasdnbaiinbaohnnbapwnba";
		//需要寻找的子串
		String key = "nba";
		//定义一个计数变量
		int count  = getKeyStringCount(str,key);
		
		System.out.println("count = "+count);
	}

	public static int getKeyStringCount(String str, String key) {
		
		int index = 0;
		int count = 0;
		
		while((index = str.indexOf(key,index))!= -1)
		{
			index = index +key.length();
			count++;
		}
		return count;
	}
	/**
	 * 获取子串在整串中出现的次数。
	 * @param str
	 * @param key
	 * @return
	 */
	public static int getKeyStringCount_1(String str, String key) {
		
		//1,定义计数器。 
		int count = 0;
		
		//2,定义变量记录key出现的位置。
		int index = 0;
		
		while((index = str.indexOf(key))!=-1){
			
			str = str.substring(index+key.length());
			count++;
		}
		return count;
	}
	
}


package cn.itcast.p1.string.demo;
/*
 * 获取最大包含子串(两个字符串中最大相同子串)
 * jhfiwkdhahjasfkj
 * sshahjasff
 * 思路:
 * 	直接考虑怎么比较,如果子串一开始就包含在大的字符串中,就直接返回即可,如果没有,就递减,子串递减的时候要考虑两边,
 * 	如:
 * sshahjasff
 * 0        9
 * 第一次递减:sshahjasf shahjasff
 * 		   0       8 1       9
 * 第二次递减:sshahjas shahjasf  hahjasff
 * 		   0      7 1      8  2      9
 * 第三次递减:sshahja  shahjas   hahjasf   ahjasff   
 * 		   0     6  1     7   2     8   3     9
 * 以此类推,就考虑每次减少一个字符后会产生多少不同的子串,直到能和长串对比出包含的最大子串就可以返回了。
 * 从递减下来的图看,类似一个三角形,只要是三角形,就能考虑到for循环嵌套。
 * (for循环条件)
 *  sshahjasff     
 *   1        10
 * 
 */
public class stringTest_2 {

	public static void main(String[] args) {
		
		String s1 = "zxcbasdfabacazcvasdxcv";
		String s2 = "asdfabacasdba";
		
		String s = getMaxString(s1,s2);
		
		System.out.println(" 最大相同子串 = "+s);

	}

	public static String getMaxString(String s1, String s2) {
		//好的方法能区别出输入的字符串哪个大哪个小
		String max = null,min = null;//定义区别长串和子串的容器
		
		max = (s1.length() > s2.length())?s1:s2;
		
		min = max.equals(s1)?s2:s1;
		
		System.out.println("max = "+max);
		System.out.println("min = "+min);

		//开始判断子串是否包含长串中
		for (int i = 0; i < min.length(); i++) {
			//根据递减效果图,需要两个变量当角标
			for (int j = 0, k = min.length() - i;   k!=min.length()+1  ; j++,k++) {
				
				String sub = min.substring(j,k);//画出规律,看着规律就容易找到循环的条件和方法
				
				if(max.contains(sub))
					return sub;
				
				
			}
			
		}
		
		
		return null;
	}

}
/*
 * 运行结果:
 * 	max = zxcbasdfabacazcvasdxcv
	min = asdfabacasdba
 	最大相同子串 = asdfabaca
 */


package cn.itcast.p1.string.demo;
/*
 * 模拟trim方法
 * 思路:
 * 给一个字符串,检测空格,从头和尾检测,检测到就去除,去除方法:锁定角标(charAt()通过角标找字符串方法)
 * 考虑到空格情况,所以有:头<=尾.length();
 * 
 */
public class stringTest_3 {

	public static void main(String[] args) {
		
		String s = "        ab  c                       ";
		
		s = Mytrim(s);
		
		System.out.println("-"+s+"-");
		

	}

	public static String Mytrim(String s) {
		
		
		int start = 0,end = s.length() - 1;//s.length()-1 为什么呀?答字符串角标越界嘛
		
		while(start <= end && s.charAt(start) == ' ')//这里给写错了,'' 字符     ,    "" 字符串呀!
		{
			start++;
		}
		while(end <= end && s.charAt(end) == ' ')
		{
			end--;
		}
		
		return s.substring(start,end +1); // end+1 为什么呀?答:因为包含头,不包含尾嘛
	}

}

练习题学会自己思考和分析问题非常重要,因为这么简单的练习都不去好好考虑,那也别学JAVA了!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值