對字串的各種操作
0.擷取一個字串中的一部分
String類的substring()方法,有兩種,substring(int index)引數是開始擷取的位置,擷取之後的字串,
substring(int beginindex,int endindex)兩個引數一個是開始處一個是結尾處,要注意擷取的字串不包括endindex的值。
1.統計一個字元出現的次數 第一種方法,用for迴圈:
//for迴圈遍歷法 int num=0; char[] c=s.toCharArray(); for(int i=0;i<c.length;i++) { if(c[i]=='s') num++; } System.out.println("s出現次數:"+num);
這裡有個知識點,char[]陣列和String可以互相轉換,String轉換成char[]陣列是 char[] c=s.toCharArray();char[]陣列再轉換成String是String.valueOf©;
第二種方法是用HashMap:
//用HashMap實現,字母為鍵,字母出現的次數為值 HashMap<Character,Integer> hm=new HashMap<>(); char[] ch=s.toCharArray(); for(int i=0;i<ch.length;i++) { if(!hm.containsKey(ch[i])) hm.put(ch[i], 1); else hm.put(ch[i], hm.get(ch[i])+1); } System.out.println("s出現的次數:"+hm.get('s'));
HashMap是儲存的是鍵值對。 2.一句英文,每個單詞首字母大寫問題 第一種方法:
/*追加字串的方法*/
StringTokenizer st=new StringTokenizer(s);
while(st.hasMoreTokens()){
String str=st.nextToken();
str=str.substring(0, 1).toUpperCase()+str.substring(1);
System.out.print(str+" ");
}
首先要把這句英文分離成一個個單詞,StringTokenizer類可以按照給定的分隔符分隔,java預設的分隔符是“空格”、“製表符(‘\t’)”、“換行符(‘\n’)”、“回車符(‘\r’)”。 分隔之後,用String類的substring()方法把首字母截取出來,再用toUpperCase()方法變成大寫字母,變成小寫字母的方法是toLowerCase()。然後再把首字母之後的內容加進來。
第二種方法要好的多,眼前一亮
/*StringTokenizer st=new StringTokenizer(s);
while(st.hasMoreTokens()){
String str=st.nextToken();
char[] ch=str.toCharArray();
ch[0]-=32;
System.out.print(String.valueOf(ch)+" ");
}
前面一樣,變換首字母大小寫的方法更巧妙了,把該單詞變成字元陣列,大小寫字母的ASCII表值相差32,所以只要減去32就可以把小寫變成大寫,相反變成小寫就要加32。 3.字串反轉問題 第一種方法比較簡潔,就是用java寫好的方法:
//stringBuffer類reverse()方法實現字串反轉
/*StringBuffer sb=new StringBuffer(s);
System.out.println(sb.reverse());*/
StringBuffer類的reverse()方法可以把字串引數反轉。
第二種方法就是用for迴圈,互換第一個和倒數第一個的字元,以此類推。
//for迴圈實現,參考AbstractStringBuilder類的reverse()方法
char[] ch=s.toCharArray();
int num=ch.length-1;
for(int i=0;i<ch.length/2;i++)
{
char j=ch[i];
char k=ch[num];
ch[i]=k;
ch[num]=j;
num--;
}
System.out.println(String.valueOf(ch));
將字串轉換成字元陣列,將陣列第一個和最後一個字元取出來,然後互換,迴圈互換,迴圈次數是陣列長度/2,比如數組裡有10個字元,/2迴圈5次互換結束,再換下去就又換回來了,如果有9個字元,/2迴圈4次,因為中間那個數的位置是不用變的。這裡可以去檢視java的原始碼,eclipse裡面ctr+滑鼠左擊類名,出現不了原始碼的話,在彈出的檢視中點選attach source,選擇jdk目錄下的src.zip即可。查原始碼可以發現,第一種方法StringBuffer類的reverse()方法是呼叫了父類的此方法。
public final class StringBuffer
extends AbstractStringBuilder
StringBuffer類繼承了AbstractStringBuilder類,在AbstractStringBuilder類裡面可以看到reverse()方法的實現。
public AbstractStringBuilder reverse() {
boolean hasSurrogates = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
char cj = value[j];
char ck = value[k];
value[j] = ck;
value[k] = cj;
if (Character.isSurrogate(cj) ||
Character.isSurrogate(ck)) {
hasSurrogates = true;
}
}
if (hasSurrogates) {
reverseAllValidSurrogatePairs();
}
return this;
}
由此可見也是利用了for迴圈。 4.判斷一個字串中有多少個字母,數字和空格等符號。
//用數字,字母,空格的ascii表值來判斷
int letter=0,num=0,blank=0;
char[] ch=s.toCharArray();
for(int i=0;i<ch.length;i++)
{
int ascii=ch[i];
if(ascii<=57&&ascii>=48)
{num++;}
if((ascii<=90&&ascii>=65)||(ascii<=122&&ascii>=97))
{letter++;}
if(ascii==32)
{blank++;}
}
System.out.println("數字的個數為:"+num+" 字母的個數為:"+letter+" 空格的個數為:"+blank);
for迴圈判斷每個字元的ASCII值是哪個範圍,數字0-9的ASCII值是48-57,大寫字母是65-90,小寫字母是97-122,空格符是32。