1. 程式人生 > >對字串的各種操作

對字串的各種操作

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。