对字符串的各种操作

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值