Java多测试用例下超长单词处理耗时异常问题排查
问题分析与解决方案
问题现象
编写的Java程序实现单词缩写逻辑:单词长度超过10时,输出首字符+中间字符数+尾字符;长度≤10则直接输出原单词。但批量执行4个测试用例时,最后一个超长单词pneumonoultramicroscopicsilicovolcanoconiosis响应时间超过30秒;单独测试该单词时却能立即输出结果。
问题原因
原代码使用Scanner.nextLine()读取每个单词,结合sc.nextInt()后的sc.nextLine()处理换行的逻辑,在批量输入场景下(尤其是包含超长文本的输入),可能触发Scanner的输入缓冲阻塞问题。nextLine()会读取整行内容,当输入行过长且前面存在未完全处理的缓冲数据时,会导致读取效率下降甚至阻塞。
修复方案
将读取单词的方式改为Scanner.next(),该方法会自动跳过所有空白字符(包括换行符),直接读取到下一个空白前的内容,完全适配单个单词的输入场景,同时可以移除多余的换行处理代码。
修改后的代码
import java.util.Scanner; public class Main { public static void main(String pkt[]) { Scanner sc = new Scanner(System.in); int loopnumber = sc.nextInt(); while (loopnumber > 0) { String word = sc.next(); int length = word.length(); int n = length - 2; if (length > 10) { System.out.println(word.charAt(0) + "" + n + "" + word.charAt(length - 1)); } else { System.out.println(word); } loopnumber--; } sc.close(); } }
验证说明
修改后,无论是批量执行4个测试用例还是单独测试超长单词,程序都能快速处理并输出结果。next()方法避免了行读取带来的缓冲问题,同时简化了输入处理逻辑。
内容的提问来源于stack exchange,提问作者Pronay Sarker
相关产品推荐
相关产品推荐

