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。