黑马程序员 java_String练习

                         ------- android培训java培训、期待与您交流! ----------

 

 

 

String类练习

 

 

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

 

思路:

       1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。

             结尾处判断空格也是如此。

 

       2,当开始和结尾都判断到不是空格时,就是要获取的字符串。

public static String myTrim(String str)
	{
		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);
	}

 从字符串两端,通过while循环分别遍历字符,循环终止条件有两个,一个是两端遍历到了同一位置,另外一个是遇到空格,空格是通过charAt来判断的。循环结束后,start表示字符串左端第一个不为空格的角标,end表示从右端开始第一个不为空格的角标。最后返回除去空格后的字

串,由于在调用substring方法是含头不含尾,所以传入end+1。

 

 

将一个字符串进行反转

 

将字符串中指定部分进行反转,"abcdefg";

思路:

      1,曾经学习过对数组的元素进行反转。

      2,将字符串变成数组,对数组反转。

      3,将反转后的数组变成字符串。

      4,只要将或反转的部分的开始和结束位置作为参数传递即可。

public static String reverseString(String s,int start,int end)
	{
		//字符串变数组。
		char[] chs = s.toCharArray();

		//反转数组。
		reverse(chs,start,end);

		//将数组变成字符串。
		return new String(chs);
	}
	public static String reverseString(String s)
	{
		return reverseString(s,0,s.length());
		
	}

	private static void reverse(char[] arr,int x,int y)
	{
		for(int start=x,end=y-1; start<end ; start++,end--)
		{
			swap(arr,start,end);
		}
	}
	private static void swap(char[] arr,int x,int y)
	{
		char temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}

因为不能直接对字符串进行反转操作,所以可以先将字符串转换为字符数组,然后将字符数组

反转,最后再将字符数组转换为字符串。上例中分别将不同的功能封装不同的方法,可以提供代码的复用性,降低耦合性。

 

 

 

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

 

获取"kk"在"abkkcdkkefkkskk"中出现的次数

思路:

     1,定义个计数器。

     2,获取kk第一次出现的位置。

     3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。

           每获取一次就计数一次。

 

     4,当获取不到时,计数完成。

 

这个练习有多种方法

 

方法一

 

public static int getSubCount_2(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;
	}
public static void sop(String str)
	{
		System.out.println(str);
	}

 index=str.indexOf(key,index)将从角标index开始遍历str中kk第一次出现的位置,并返回此位置,如果没有key则返回-1,循环结束。初始值为0,表示从str第一个位置开始遍历。每循环一次,index都将重新赋值,新的index为最近一次遍历到key的位置再加上key的长度。每循环一次计数器自增一次。

 

方法二

 

public static int getSubCount(String str,String key)
	{
		int count = 0;
		int index = 0;

		while((index=str.indexOf(key))!=-1)
		{
			sop("str="+str);//
			str = str.substring(index+key.length());

			count++;	
		}
		return count;
	}

通过 index=str.indexOf(key)来获取key在str中第一次出现的位置。只是index在循环中没有重新赋值,而是通过str = str.substring(index+key.length()),将每次查找到一个key就将剩余部分,抽取为一个新的字串,再在这个字串中查找key。

 

方法三

 

String str = "kkabkkcdkkefkks";

	sop("count====="+str.split("kk").length);不建议使用。

调用str.split("kk").length会返回一个字符串数组。str被切割后分成几段,每一段作为字符串数组

的一个元素。但是有一个问题,当"kk"在str最左边时,此时调用splite方法,会在第一个"kk"前

面返回一个空字符串。结果count值就要比字符串str中"kk"个数多一个,然而最末端有"kk"则不会出错,这是因为split(String regex)方法造成的,如果字符串切割后会抛弃末尾的空字符串。

所以不建议使用此方法。

 

 

 

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

 

找到字符串"abcwerthelloyuiodef"和"cvhellobnm"中的最大相同字串

 

此题,应该从子串的长度考虑。

 

思路:

1,将短的那个子串按照长度递减的方式获取到。

2,将每获取到的子串去长串中判断是否包含,如果包含,已经找到!。

 

 

public static String getMaxSubString(String s1,String s2)
	{

		String max = "",min = "";
                //让max表示长度那个字符串,min表示短的那个字符串
		max = (s1.length()>s2.length())?s1: s2;

		min = (max==s1)?s2: s1;
		
//		sop("max="+max+"...min="+min);
		for(int x=0; x<min.length(); x++)
		{
			for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
			{
				String temp = min.substring(y,z);
				
				sop(temp);
				if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
					return temp;
			}
		}
		return "";
	}

max表示长度较大的那个字符串,min表示长度较小的那个字符串,temp表示最大相同字符串,当max,min没用相同字符串是返回空字符串。本题中,是通过两个循环,不断遍历min中的字串,然后判断max中是否含有此字符串。通过第一个循环,决定字串长度,min.length-x为字串长度。在第二个循环中,从min中拿到长度为min.length-1的所有字串,通过contains判断max中是否含有此字符串。如果有结束循环,返回此字符串,如果没有,退出内层循环,字串长度减一,进入内层循环,接着判断。

 

 

 

         ------- android培训java培训、期待与您交流! ----------

你可能感兴趣的:(String)