(59)字符串练习
一、模拟trim方法去除两端的空格(—bh—)
public static void SimulateTrim() {
/*
* 需求:将字符串两端的空格去掉(这个两端不仅0,尾)
* 思路:1前面有个指针start,逐一向后判断,直到非空
* 2后面有个指针end,逐一向前判断,直到非空
* 3.start以及之前和end以及之后都是判断过的,所以start<end
* 有start==end原因是:"-----a",判断到a时,start==end,但是仍要判断
*
*/
//String s="---abc----";
//String s="----";
//String s="----a";
String s="a----";
int start=0;
int end=s.length()-1;
Object String ;
while(start<=end&s.charAt(start)=='-')/*注意不会出现下标越界情况,因为有end控制着呢,当start==end,若不为空,则这个字符串就一个字符;
*若为空,则start=end+1;while 判断失败,while(end)不执行*/
start++;
while(start<=end&s.charAt(end)=='-') {
end--;
}
if(start>end) //若为空,则start先执行,等于end;end后执行,end-1,所以start>end为空串
sop("这是个只含空格的字符串");
else
sop("哈哈"+s.substring(start, end+1)+"哈哈");
}
二、去除字符串两端(0、末尾)的空格
public static void SimulateTrim() {
/*
* 思路:1获得0,s.length-1位置上的字符,
* 若0号,最后都不为空,则直接输出该字符串即可
* 若0号位不空,最后空,则获取子串,substring(0,leng-1)
* 若0号位空,最后不空,则获取substring(1,leng-1)
* 若0、最后均空,则获取substring(1,leng-2)
*/
//String s=" abcdef ";
//String s=" abcdef";
//String s="abcd ";
//String s=" abcd";
String s=" abcd ";
String s1=null;
if(s.charAt(0)!=' '&(s.charAt(s.length()-1)!=' ')) {
s1=s.substring(0, s.length());
System.out.println("0号、最后都不为空");
}
else if(s.charAt(0)!=' '&(s.charAt(s.length()-1)==' ')) {
s1=s.substring(0, s.length()-1);
System.out.println("0号不为空、最后为空");
}
else if(s.charAt(0)==' '&(s.charAt(s.length()-1)!=' ')) {
s1=s.substring(1, s.length());
System.out.println("0号空、最后不空");
}
else {
s1=s.substring(1, s.length()-1);
System.out.println("0号、最后都为空");
}
sop(s1+"哈哈哈");
}
三、删除字符串中的所有空格
public static void SimulateTrim_1() {
/*
* 思路:1先将字符串转换为字符数组ch1,新建一个与字符串相同长度的字符数组ch2(非空字符最多为原字符串长度)
* 2将ch1的每一个元素都和空比较,当不空时,将此字符放入ch2,并且有个计数器
* 3将ch2转换字符串
* 4截取非空的子字符串部分
*/
String s="acb de v ";
char [] ch1=s.toCharArray();
char [] ch2=new char[s.length()];
int count=0;
for(int i=0;i<ch1.length;i++) {
if(ch1[i]!=' ')
{
ch2[count]=ch1[i];
count=count+1;
}
}
String s1=new String(ch2);
String s2=s1.substring(0, count);
sop(s2+"s2的长度为:"+s2.length());
}
四、将一个字符串进行部分反转“abcdefg” “abfedcg”
public static void methodReverse() {
/*
* 需求:将字符串中指定部分进行反转 "abcdefg" "abfedcg"
* 思路:1获取子串,将子字符串转换为字符数组 ch [toCharArray()],还需个数组,接收反转的数据
* 2将字符数组上的元素反转for实现
* 3将字符数组ch转换为字符串
* 4字符串连接
*/
String s="abcdefg";//将下标2-5转换
String s1=s.substring(2, 6);
char[] ch=s1.toCharArray();
char[] ch1=new char[ch.length];
for(int x=0;x<ch.length;x++) {
ch1[(ch.length-1)-x]=ch[x];
}
String s3=new String(ch1);
sop(s.substring(0, 2)+s3+s.substring(6));
}
五、获取特定字符个数
public static void methodGet() {
/*
* 思路:1将字符串转换为字符数组
* 2判断字符数组中每个元素是否和特定元素相同,for,需要计数器
*/
String s="abkkcdkkefkkskk";
char [] ch=s.toCharArray();
int count=0;
for(int x=0;x<ch.length;x++) {
if(ch[x]=='k') {
count++;
}
}
sop("k的个数为:"+count);
}
六、获取两个字符串中最大相同子串(s1.ength()>s2.length())
public static String methodTrim3(String s1,String s2) {
/*
* 需求:给两个串,s1,s2,寻找s1在s2的最大子串(在此方法中s1>s2长度)
* 思路:通过不断缩小字符串长度,来寻找s1中是否有该子串(contains方法,返回布尔值)
* 外层控制每次s2子串的长度,但是间接控制
* 因为长度相同的子串可能有多个,通过a,z同时后移,来控制子串的长度不变,直到z到length+1(因为要先获得子串sbuString(int start,int end)
* z=s2.length()-x:控制子串的长度,第一次(相对外层):length-0,第二次:length-1.....
*/
for(int x=0;x<s2.length();x++) {
for(int a=0,z=s2.length()-x;z!=s2.length()+1;a++,z++) {
String temp=s2.substring(a, z);
if(s1.contains(temp)) {
return temp;
}
}
}
return "";
}
七、获取两个字符串中最大相同子串(需要判断哪个两个字符串的长短)
public static String getMax_1(String s1,String s2) {
/*
* 需求:寻找最大子串
* 在getMax方法中已经实现了,但是有个小问题,因为用户输入,s1,s2长度并不是确定的,
* 但是呢,都应该是在小串中寻找是否大串包含小串的子串。
* 所以,先判断传进来字符串的长度(就是判断谁当大串,谁当小串),在for中用那个小串即可
*/
String max=((s1.length()>s2.length())?s1:s2);
String min=(s1==max)?s2:s1;
sop("max="+max+"-----"+"min"+min);
for(int x=0;x<min.length();x++) {
for(int a=0,z=min.length()-x;z!=min.length()+1;a++,z++) {
String temp=min.substring(a, z);
if(max.contains(temp)) {
return temp;
}
}
}
return "";
}