public class ExtractNumbersFromString {
public static String extractNumbers(String inputString) {
if (inputString == null || inputString.isEmpty()) {
return ""; // 空字符串或null输入,直接返回空字符串
}
StringBuilder digitString = new StringBuilder(); // 使用StringBuilder高效构建字符串
for (int i = 0; i < inputString.length(); i++) {
char currentChar = inputString.charAt(i); // 获取字符串中的每个字符
if (Character.isDigit(currentChar)) { // 使用Character.isDigit()方法判断是否为数字
digitString.append(currentChar); // 如果是数字,则添加到StringBuilder中
}
}
return digitString.toString(); // 将StringBuilder转换为String并返回
}
public static void main(String[] args) {
String input = "ABC137GMNQQ2049PN5FFF";
String output = extractNumbers(input);
System.out.println("输入字符串: " + input);
System.out.println("输出结果: " + output); // 输出结果: 13720495 (根据题目描述,这里应该是13720495,题目示例输出可能存在笔误)
String input2 = "NoDigitsHere";
String output2 = extractNumbers(input2);
System.out.println("\n输入字符串: " + input2);
System.out.println("输出结果: " + output2); // 输出结果: (空字符串)
String input3 = "12345";
String output3 = extractNumbers(input3);
System.out.println("\n输入字符串: " + input3);
System.out.println("输出结果: " + output3); // 输出结果: 12345
String input4 = "";
String output4 = extractNumbers(input4);
System.out.println("\n输入字符串: " + input4);
System.out.println("输出结果: " + output4); // 输出结果: (空字符串)
String input5 = null;
String output5 = extractNumbers(input5);
System.out.println("\n输入字符串: " + input5);
System.out.println("输出结果: " + output5); // 输出结果: (空字符串)
}
}
代码解释:
- extractNumbers(String inputString) 方法:
- 输入参数: inputString,类型为 String,表示包含数字和字符的输入字符串。
- 空值和空字符串处理:
- java复制代码
- if (inputString == null || inputString.isEmpty()) { return ""; } 首先检查输入的字符串是否为 null 或者为空字符串 ""。如果是,则直接返回空字符串,避免空指针异常,并处理了输入为空的情况。
- StringBuilder digitString = new StringBuilder();: 创建一个 StringBuilder 对象 digitString。StringBuilder 用于高效地构建字符串,尤其是在循环中频繁拼接字符串时,性能比直接使用 String 的 + 运算符要好得多。
- for (int i = 0; i < inputString.length(); i++) { ... }: 使用 for 循环遍历输入字符串 inputString 的每一个字符。
- char currentChar = inputString.charAt(i);: 在循环中,使用 inputString.charAt(i) 获取当前索引 i 处的字符,并将其赋值给 currentChar 变量。
- if (Character.isDigit(currentChar)) { ... }: 使用 Character.isDigit(currentChar) 方法来判断 currentChar 是否是一个数字字符。Character.isDigit() 是 Java 中用于判断字符是否为数字的静态方法,它能正确识别 Unicode 数字字符。
- digitString.append(currentChar);: 如果 currentChar 被判断为数字字符(Character.isDigit() 返回 true),则使用 digitString.append(currentChar) 将该数字字符追加到 StringBuilder 对象 digitString 的末尾。
- return digitString.toString();: 循环结束后,digitString 中就包含了从输入字符串中按顺序提取的所有数字字符。最后,使用 digitString.toString() 方法将 StringBuilder 对象转换为 String 对象,并将其作为方法的返回值返回。
- main(String[] args) 方法:
- main 方法用于测试 extractNumbers 方法。
- 创建了多个不同的输入字符串 (input, input2, input3, input4, input5),包括包含数字和字符的字符串、不包含数字的字符串、只包含数字的字符串、空字符串和 null 值。
- 分别调用 extractNumbers 方法处理这些输入字符串,并将输入字符串和输出结果打印到控制台,以便验证 extractNumbers 方法的正确性。
关于题目示例输出的说明:
题目描述中给出的示例输出 “01234579” 可能存在笔误。 根据题目要求 “将由数字及字符组成的字符串中的数字截取出来并按顺序输出” 以及示例输入 “ABC137GMNQQ2049PN5FFF”, 正确的输出结果应该是 “13720495”,即按照数字在原字符串中出现的顺序输出。
如果题目示例输出 “01234579” 是有意为之, 那么题目可能隐含了更复杂的要求,例如:
- 先截取数字,然后排序并去重? 但题目描述并没有提到排序或去重。
- 示例输出本身就是错误的? 这是最有可能的情况,因为 “01234579” 看起来像是对某些数字进行了排序或特殊处理,但与题目描述的 “按顺序输出” 相矛盾。
本代码示例是基于对题目描述 “按顺序输出” 的理解来实现的,输出结果为 “13720495”,与示例输入逻辑一致。 如果实际需求与题目示例输出 “01234579” 一致,则需要根据具体需求修改代码逻辑,例如在提取数字后进行排序等操作。
如果要实现题目示例输出 “01234579” (虽然与题目描述略有矛盾),可能需要进行如下修改 (仅为猜测,因为题目描述和示例输出不一致):
java复制代码import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class ExtractNumbersFromStringSorted {
public static String extractNumbersSorted(String inputString) {
if (inputString == null || inputString.isEmpty()) {
return "";
}
Set digitSet = new TreeSet<>(); // 使用TreeSet自动排序并去重
for (int i = 0; i < inputString.length(); i++) {
char currentChar = inputString.charAt(i);
if (Character.isDigit(currentChar)) {
digitSet.add(Integer.parseInt(String.valueOf(currentChar))); // 转换为Integer并添加到Set
}
}
StringBuilder sortedDigitString = new StringBuilder();
for (Integer digit : digitSet) {
sortedDigitString.append(digit); // 按排序后的顺序添加到StringBuilder
}
return sortedDigitString.toString();
}
public static void main(String[] args) {
String input = "ABC137GMNQQ2049PN5FFF";
String output = extractNumbersSorted(input);
System.out.println("输入字符串: " + input);
System.out.println("输出结果: " + output); // 输出结果: 01234579 (与题目示例输出一致,但与题目描述略有矛盾)
}
}
修改后的代码解释 (针对示例输出 “01234579”):
- Set
digitSet = new TreeSet<>(); : 使用 TreeSet 来存储提取的数字。TreeSet 会自动对元素进行排序,并且不允许重复元素 (去重)。 - digitSet.add(Integer.parseInt(String.valueOf(currentChar)));: 将提取的数字字符转换为 Integer 对象,并添加到 digitSet 中。
- 遍历 digitSet: 由于 TreeSet 已经排序,遍历 digitSet 时,数字会按照升序排列。
- 构建排序后的字符串: 将排序后的数字字符添加到 StringBuilder 中。
请根据实际题目要求和期望的输出结果选择合适的代码版本。 如果题目确实要求输出 “01234579”,则后一个排序去重的版本更符合示例输出,但与 “按顺序输出” 的描述略有偏差。 如果更倾向于 “按顺序输出” 的描述,则第一个代码版本 (输出 “13720495”) 更符合逻辑。