練習
1.模擬一個trim方法,去除字符串兩端的空格。
思路:
1)判斷字符串第一個位置是否是空格,如果是繼續向下判斷,直到不是空格,結尾處判斷空格也是如此。
2)當開始和結尾都判斷到不是空格時,就是要獲取的字符串。
分析:
主要代碼:
1 public static String myTrim(String str) 2 3 { 4 5 int start = 0,end = str.length() - 1; 6 7 while(start <= end && str.charAt(start) == ' ') 8 9 start++; 10 11 while(start <= end && str.charAt(end) == ' ') 12 13 end--; 14 15 //這樣我們就獲取到了中間有效的字符串,並且這個有效的字符串是 16 17 //整個字符串的子串,我們就用獲取子串的方法來獲取 18 19 return str.substring(start,end+1);//為什么加1,注意包含頭不包含尾。 20 21 }
運行結果:
2.將一個字符串進行反轉。例:”abcdefg”反轉成“abfedcg”.
思路:
1)曾經學習過對數組的元素進行反轉
2)將字符串變成數組,對數組反轉。
3)將反轉后的數組變成字符串,
4)只要將或反轉的部分的開始和結束位置作為參數傳遞即可。
主要代碼:
public static String reverseString(String s) { //字符串變數組 char[] chs = s.toCharArray(); //反轉數組,創建特有方法 reverse(chs); //將數組變成字符串 return new String(chs); } //如果不想吧方法暴露出去(讓其他類引用),可以設置方法的修飾符為private private static void reverse(char[] arr) { //數組反轉就是頭尾互換 for(int start = 0,end = arr.length-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; }
運行結果:
拓展:將字符串中指定部分進行反轉。
拓展主要代碼:
1 public static String reverseString(String s,int start,int end) 2 3 { 4 5 //還是和練習二一致先將字符串變數組 6 7 char[] chs = s.toCharArray(); 8 9 //反轉數組,創建特有方法,但這里反轉的是字符串的一部分 10 11 reverse(chs,start,end); 12 13 //將數組變成字符串 14 15 return new String(chs); 16 17 } 18 19 private static void reverse(char[] arr,int x,int y) 20 21 { 22 23 //數組反轉就是頭尾互換 24 25 //注意因為在java中,涉及到取從頭到尾的部分一般情況下都是包含頭不包含尾 26 27 //為什么這么寫呢,因為官方這樣操作取值的方法中參數往往是一個起始點和所要取值的長度,便於取整。 28 29 //而長度減一就是最后的腳標。 30 31 //所以在這里我們遵照官方(習慣),將尾的腳標減一 32 33 for(int start = x,end = y-1;start<end;start++,end--) 34 35 { 36 37 swap(arr,start,end); 38 39 } 40 41 }
運行結果:
3.獲取一個字符串在另一個字符串中出現的次數。”abkkcdkkefkkskk”.
思路:
1)定義一個計數器;
2)獲取kk第一次出現的位置;
3)從第一次出現位置后剩余的字符串中繼續獲取kk出現的位置,每獲取一次就計數一次。
4)當獲取不到十,計數完成。
分析:
我們要想找這個kk,首先,判斷是否存在kk,如果kk都不存在,那么我們也就不用查次數了。如果存在,就獲取位置。既判斷存在又獲取位置,用indexOf方法,不存在返回-1.
本例中,kk是在2腳標的地方首次出現,我們計數一次,下一次我們找就應該從2腳標+kk的長度2=4腳標的地方開始找,找到再加一,(技巧,涉及計數器的地方就會有循環),那循環我們怎樣設定呢?是不是當我們找的子串中沒有kk了,循環就結束了?這樣,代碼就有了。
主要代碼:
1 //方法一 2 3 public static int getSubCount(String str,String key) 4 5 { 6 7 //定義計數器 8 9 int count = 0; 10 11 //定義變量記錄位置 12 13 int index = 0; 14 15 while((index = str.indexOf(key)) != -1) 16 17 { 18 19 sop("str ="+str); 20 21 str = str.substring(index+key.length()); 22 23 count++; 24 25 } 26 27 return count; 28 29 }
結果:
1 //練習三,方法二 2 3 //indexOf()方法有個重載方法Int indexOf(String str,int fromIndex) 4 5 //indexOf(String str)方法每一次都是從0腳標位開始查找,為此我們還得獲取子串 6 7 public static int getSubCount_2(String str,String key) 8 9 { 10 11 //定義計數器 12 13 int count = 0; 14 15 //定義變量記錄位置 16 17 int index = 0; 18 19 while((index = str.indexOf(key,index)) !=-1 ) 20 21 { 22 23 sop("index=" + index); 24 25 index = index + key.length(); 26 27 count++; 28 29 } 30 31 return count; 32 33 }
結果:
練習三注意:
針對練習三,有人會想到采用字符串切割的方法. 這里是可行的。
但我們換另一個字符串
“kkdwghduwhudkksufbusdhfu”
如果用切割,並且0腳標開始就是我們要查的字符串,那么第一次切得時候就是兩個字符串
一個是kk前面系統自動“補全”的空字符串
一個是kk后面的串“dwghduwhudkksufbusdhfu”
這樣,就會平白無故多出來一個串,也就多出了一個數,可能
結果也不再是我們想要的結果。也就是說,用切割的方法不通用。
所以,不建議使用切割。
4.獲取兩個字符串中最大相同的子串。第一個動作:將短串進行長度依次遞減的子串打印。
“abcwerthellouyiodef”
“cvhellobnm”
思路:
1)將短串按照長度遞減的方式獲取到。
2)將每獲取到的子串去長串中判斷是否包含,如果包含,已經找到。
分析:
主要代碼:
1 //練習四 獲取兩個字符串中最大相同的子串 2 3 public static String getMaxSubString(String s1,String s2) 4 5 { 6 7 //因為傳過來的兩個字符串不知道誰長誰短 8 9 //所以先進行判斷 10 11 String max = "", min = ""; 12 13 max = (s1.length()>s2.length())?s1:s2; 14 15 min = (max ==s1)?s2:s1; 16 17 for(int x = 0;x<min.length();x++) 18 19 { 20 21 for(int y=0 ,z= (min.length()) - x;z != min.length()+1;y++,z++) 22 23 { 24 25 String temp = min.substring(y,z); 26 27 //sop(temp); 28 29 if(max.contains(temp))//if(s1.indexOf(temp) != -1) 30 31 return temp; 32 33 } 34 35 } 36 37 38 39 return ""; 40 41 }
運行結果: