package cn.xxx;
import java.util.Scanner;
/*输入一行字符加分别统计出其中英文字母、空格、数字和其它字符的个数*/
public class Launch {
public static void main(String[] args) {
System.out.println("Please input a sentence:");
Scanner in=new Scanner(System.in);
String str=in.nextLine();
in.close();
str = str.toLowerCase();
int nums=0,chars=0,blanks=0,other=0;
int i = 0;
while ( i < str.length() ) {
if ( "abcdefghijklmnopqrstuvwxyz".contains(str.charAt(i)+"") ) {
chars++;
i++;
} else if ( "0123456789".contains(str.charAt(i)+"") ) {
nums++;
i++;
} else if ( " ".contains(str.charAt(i)+"") ) {
blanks++;
i++;
} else{
/*
* 关于其他字符用分支的说明。
* java底层用utf-16实现char的存储,即用16位二进制(一个代码单元)存储char,
* 但这样最多只能存储2^16=65536个字符,为了解决utf-16溢出
* 的字符(辅助字符)存储,java采用两个代码单元存储,utf-16码点U+D800-U+DBFF用于第一个代码单元,
* utf-16码点U+DC00-U+DFFF用于第二个代码单元。而Character.isSupplementaryCodePoint(int cp)
* 可以判断该代码单元cp是否是辅助字符的代码单元。
* 对于本题,辅助字符也考虑到了,例如字符𝕆(U+1D546),
* 如果单纯地用char来判断而注释if语句,会执行两次循环对other++,得到的结果是2,而实际上结果应该是1。
* */
int cp = str.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp)){
i+=2;
} else {
i++;
}
other++;
}
}
System.out.println("英文字母:"+chars);
System.out.println("空格:"+blanks);
System.out.println("数字:"+nums);
System.out.println("其他字符:"+other);
}
}
关于其他字符用分支的说明。
* java底层用utf-16实现char的存储,即用16位二进制(一个代码单元)存储char,
* 但这样最多只能存储2^16=65536个字符,为了解决utf-16溢出
* 的字符(辅助字符)存储,java采用两个代码单元存储,utf-16码点U+D800-U+DBFF用于第一个代码单元,
* utf-16码点U+DC00-U+DFFF用于第二个代码单元。而Character.isSupplementaryCodePoint(int cp)
* 可以判断该代码单元cp是否是辅助字符的代码单元。
* 对于本题,辅助字符也考虑到了,例如字符𝕆(U+1D546),
* 如果单纯地用char来判断而注释if语句,会执行两次循环对other++,得到的结果是2,而实际上结果应该是1。