------- 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中是否含有此字符串。如果有结束循环,返回此字符串,如果没有,退出内层循环,字串长度减一,进入内层循环,接着判断。