题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数?
程序分析
我们需要编写一个程序,统计输入的一行字符中的英文字母、空格、数字和其他字符的个数。我们可以使用字符输入流和字符分类函数来实现这个统计过程。
解题思路
- 使用Java的字符输入流,逐个读取输入的字符。
- 对每个字符进行判断,判断其是否为英文字母、空格、数字或其他字符。
- 根据判断结果对相应的计数器进行增加。
- 输出统计结果。
方法1: 使用字符分类函数
import java.util.Scanner;
public class CharacterCounter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a line of characters: ");
String input = scanner.nextLine();
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
for (char c : input.toCharArray()) {
if (Character.isLetter(c)) {
letterCount++;
} else if (Character.isDigit(c)) {
digitCount++;
} else if (Character.isWhitespace(c)) {
spaceCount++;
} else {
otherCount++;
}
}
System.out.println("Letters: " + letterCount);
System.out.println("Spaces: " + spaceCount);
System.out.println("Digits: " + digitCount);
System.out.println("Others: " + otherCount);
}
}
优缺点:
- 优点:
- 使用了Java内置的字符分类函数,代码简洁,易于理解。
- 缺点:
- 可能效率略低于手动判断字符类型。
方法2: 使用ASCII码范围判断字符类型
import java.util.Scanner;
public class CharacterCounter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a line of characters: ");
String input = scanner.nextLine();
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
for (char c : input.toCharArray()) {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
letterCount++;
} else if (c >= '0' && c <= '9') {
digitCount++;
} else if (c == ' ') {
spaceCount++;
} else {
otherCount++;
}
}
System.out.println("Letters: " + letterCount);
System.out.println("Spaces: " + spaceCount);
System.out.println("Digits: " + digitCount);
System.out.println("Others: " + otherCount);
}
}
优缺点:
- 优点:
- 使用ASCII码范围判断字符类型,比方法1效率稍高。
- 缺点:
- 逻辑较为繁琐,需要多次使用条件判断。
方法3: 使用正则表达式
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CharacterCounter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a line of characters: ");
String input = scanner.nextLine();
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
Pattern letterPattern = Pattern.compile("[a-zA-Z]");
Pattern digitPattern = Pattern.compile("[0-9]");
Pattern spacePattern = Pattern.compile("\\s");
for (char c : input.toCharArray()) {
String str = String.valueOf(c);
Matcher letterMatcher = letterPattern.matcher(str);
Matcher digitMatcher = digitPattern.matcher(str);
Matcher spaceMatcher = spacePattern.matcher(str);
if (letterMatcher.matches()) {
letterCount++;
} else if (digitMatcher.matches()) {
digitCount++;
} else if (spaceMatcher.matches()) {
spaceCount++;
} else {
otherCount++;
}
}
System.out.println("Letters: " + letterCount);
System.out.println("Spaces: " + spaceCount);
System.out.println("Digits: " + digitCount);
System.out.println("Others: " + otherCount);
}
}
优缺点:
- 优点:
- 使用正则表达式简化了字符类型判断,代码相对简洁。
- 缺点:
- 正则表达式可能会有一定的性能开销。
总结
推荐方法1(使用字符分类函数)作为最好的实现方式,因为它使用了Java内置的字符分类函数,代码简洁且易于理解。方法2(使用ASCII码范围判断字符类型)也是一个不错的选择,效率稍高,但可能逻辑较繁琐。方法3(使用正则表达式)虽然简化了判断逻辑,但可能会带来一定的性能开销。选择最适合具体应用场景、易于理解和维护的方法是关键。