String类__【String类的应用】



,模拟一个trim方法,去除字符串两端的空格。

思路:
1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。
结尾处判断空格也是如此。
2,当开始和结尾都判断到不是空格时,就是要获取的字符串。

,将一个字符串进行反转。

将字符串中指定部分进行反转,"abcdefg";abfedcg
思路:
1,曾经学习过对数组的元素进行反转。
2,将字符串变成数组,对数组反转。
3,将反转后的数组变成字符串。
4,只要将或反转的部分的开始和结束位置作为参数传递即可。


class  StringTest
{
	public static void sop(String str)
	{
		System.out.println(str);
	}	
	public static void main(String[] args) 
	{
		String s = "     ab8 ef6     ";
		sop("Orig:"+s);
//		s = myTrim(s);
//		sop(s);
		sop("All :"+reverseString(s));
		sop("Part:"+reverseString(s,5,9));

	}

		//练习一,模拟trim去两边空格				
	public static String myTrim(String str)//注意返回值String	
	{
		int start=0, end= str.length()-1;
		while (start<end && str.charAt(start)==' ')
			start++;//削头
		while (start<end && str.charAt(end)==' ')
			end--;	//去尾
		return str.substring(start,end+1);//包含头,不包含尾,所以要+1
	}

		//练习二,将字符串反转
	public static String reverseString(String s, int start,int end)	//反转一部分
	{
		char[] chs = s.toCharArray();//	1,将字符串变成数组
		
		reverse(chs,start,end);				//	2,对数组反转,细分功能
		
		return new String(chs);		//	3,将数组变成字符串
	}
	public static String reverseString(String s)//重载				//反转全部
	{
		return reverseString(s,0,s.length()-1);	//重载
	}

	public static void reverse(char[] arr, int x, int y)//头尾反转
	{
		for (int start=x, end=y ; start<end ;start++,end-- )//注意参数列表
		{
			swap(arr, start, end);		//元素交换	,再细分功能
		}
	}
	public static void swap(char[] arr, int x, int y)
	{						//异或
		char temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}
}

【小结】
1,抽象设计思想的应用;将函数功能尽可能的细分,使其更有条理,便于修改;
2,善用逻辑运算符,减少判断的次数,如练习一;
3,善用重载,如练习二,return时在重载中调用,使功能更加完善又不增加太多代码;
4,调用方法时别忘了加括号();


,获取一个字符串在另一个字符串中出现的次数。

"abkkcdkkefkkskk"
思路:
1,定义个计数器。
2,获取kk第一次出现的位置。
3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。
每获取一次就计数一次。
4,当获取不到时,计数完成。

class StringTest2 
{
	public static void sop(String str)
	{
		System.out.println(str);
	}
	
	public static void main(String[] args) 
	{
		String str = "ffadffassffadffsff";

		//sop("count="+getSubCount(str,"ff"));
		sop("count="+getSubCount2(str,"ff"));
		sop("count="+str.split("ff").length);//不使用split的原因是当要截取的字符串刚好处于第一位时
											//回多出来一个""空字符串,占用一个角标,引起计数不准确
	}
	
//练习三 获取一个字符串在另一个字符串中出现的次数

	public static int getSubCount(String str, String key)//子字符串从零开始判断
	{
		int count = 0;//计数器
		int index = 0;//角标

		while( (index= str.indexOf(key)) !=-1 )//注意参数:index是变化的可以在一个条件里面同时加入赋值和判断要加()
		{
			sop("str="+str);
			str = str.substring(index+key.length());//从出现位置开始,往后继获取,
			//每获取一次就出现一个新的子字符串,循环
			count++;
		}
		return count;
	}
		//int indexOf( int ch);    返回ch在字符串中第一次出现的位置,如上所示
		//int indexOf( int ch, int formIndex); 从fromIndex指定位置开始,获取ch字符在字符串中第一次出现的位置
//更高效的方法
	public static int getSubCount2(String str ,String key)
	{
		int count = 0;
		int index = 0;
		while ((index= str.indexOf(key,index)) !=-1)
		{
			sop("index="+index);
			index = index + key.length();
			count++;
		}
		return count;
	}	
}


【小结】
1,对数组进行操作时,操作角标比操作元素本身更为高效

2,获取次数是一个计数器思想的应用

3,使用split方法时要注意:无论截取位置位于字符串中哪一个位置,每截取一次都会增加一个子串,在开头和结尾就增加一个空字符串""。


四,获取两个字符串中最大相同子串。

第一个动作:将短的那个串进行长度一次递减的子串打印。
"abcwerthelloyuiodef"
"cvhellobnm"
思路:
1,将短的那个子串按照长度递减的方式获取到。
2,将每获取到的子串去长串中判断是否包含,如果包含,已经找到!。

class StringTest3 
{
	public static void sop (String str)
	{
		System.out.println(str);
	}
	public static void main(String[] args) 
	{
		String s1= "dadfhelloasdd";
		String s2= "fghelloggr";
		sop(getMaxSubString(s1,s2));
	}

	public static String getMaxSubString(String s1,String s2)
	{
		String max = "",min = "";		//比较大小,处理较短的字符串,控制循环次数
		max = (s1.length()>s2.length())?s1:s2;
		min = (max==s1)?s2:s1;

		for (int x =0 ; x<min.length() ;x++ )	//大圈套小圈思想
		{
			for (int y=0, z=min .length()-x; z!=min.length()+1 ; y++,z++ )//两个变量控制字符段右移,包含头不包含尾,所以尾角标+1
			{
				String temp = min.substring(y,z);
				if (max.contains(temp))
					return temp;
			}
		}
		return "";//返回值明确为String类型,不能省略return
	}
}
【小结】
1,灵活运用运算符,例如使用三元运算付替代if语句,使用逻辑运算符控制参数
2,循环的参数列表,可以有多个参数来控制循环

3,有明确返回值的函数一定不能省略return




原文地址:https://www.cnblogs.com/Joure/p/4337226.html