Java字母排序输出异常排查:代码逻辑是否正确?ArrayList更优吗?
问题解答
1. 正确对用户输入字符串进行字母排序的方法
要实现正确的字母排序,需按以下步骤处理:
- 输入预处理:读取逗号分隔的字符串后,拆分每个元素并清理首尾空白(空格、制表符等),避免空白字符干扰排序逻辑。
- 执行排序:使用大小写不敏感的排序规则(如
String.CASE_INSENSITIVE_ORDER),保证排序结果符合日常字母顺序习惯。 - 输出结果:遍历排序后的集合或数组,跳过空元素后逐个打印。
2. 当前代码的逻辑问题及最后一个名称错误的原因
核心排序逻辑是正确的,但缺少输入预处理环节,这是导致最后一个名称异常的关键:
- 若用户输入末尾带逗号(比如
"Tom,Jerry,"),split(",")会生成空字符串作为最后一个元素,打印时出现空白行,看起来像"错误"。 - 若名称前后带有空格(比如
"Tom, Jerry ,Alice"),拆分后的元素包含空格(如" Jerry "),排序时空格ASCII值小于字母,会导致元素位置异常,或打印时显示多余空格。
修正后的代码(添加空白清理和空元素过滤):
import java.util.Arrays; import java.util.Scanner; public class SortNames { public static void main(String[] args) { System.out.println("Please enter a list of names delimited by commas: "); Scanner userInputScanner = new Scanner(System.in); String userInput = userInputScanner.nextLine(); String[] userInputArray = userInput.split(","); // 清理每个元素的首尾空白 for (int i = 0; i < userInputArray.length; i++) { userInputArray[i] = userInputArray[i].trim(); } String[] listOrdered = displayListOrdered(userInputArray); for (String name : listOrdered) { // 过滤空字符串 if (!name.isEmpty()) { System.out.println(name); } } userInputScanner.close(); } public static String[] displayListOrdered(String[] inputArray) { Arrays.sort(inputArray, String.CASE_INSENSITIVE_ORDER); return inputArray; } }
3. 使用ArrayList是否更优?
是否选择ArrayList取决于使用场景:
- 仅需排序打印:当前数组实现足够高效,无需切换ArrayList,数组在内存占用和遍历效率上更直接。
- 需动态操作(增删元素):ArrayList优势明显,支持动态扩容和丰富的集合操作(比如
removeIf()直接过滤空元素)。示例代码:
import java.util.ArrayList; import java.util.Scanner; public class SortNamesWithArrayList { public static void main(String[] args) { System.out.println("Please enter a list of names delimited by commas: "); Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); String[] splitNames = input.split(","); ArrayList<String> nameList = new ArrayList<>(); for (String name : splitNames) { String trimmedName = name.trim(); if (!trimmedName.isEmpty()) { nameList.add(trimmedName); } } nameList.sort(String.CASE_INSENSITIVE_ORDER); for (String name : nameList) { System.out.println(name); } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Mustafa Erdogan
相关产品推荐
相关产品推荐

