Java检查字符串是否按字母顺序排列的代码问题排查
Java代码问题排查与修正
你的代码存在多个逻辑错误,直接导致输出结果不符合预期,具体问题如下:
- 核心判断逻辑完全偏离需求:你写的循环只做了「当前字符是不是字母」的判断,从头到尾没有对相邻字符的字母顺序做大小比较——这是最根本的逻辑缺失,本来要做的是校验前一个字符的字母顺序不大于后一个字符,现有代码完全没实现这步校验。
- 循环内对
isInOrder的赋值会被反复覆盖:每遍历一个字符,不管之前的判断结果是什么,都会根据当前字符的情况重新给isInOrder赋值,最终这个变量存的只是字符串最后一个字符的判断结果,完全失去了全局校验的意义。 - 条件判断误用赋值运算符:你写的
if ( isInOrder = false )、else if ( isInOrder = true )用的是单等号的赋值操作,不是双等号的相等比较。这两行代码的实际效果是:先把false赋值给isInOrder,作为判断条件永远不成立;进入else分支后又把true赋值给isInOrder,直接触发对应输出。这就是为啥不管输入啥,程序永远输出"Alphabetical!"的直接原因。 - 局部变量初始化逻辑不严谨:原代码中
isInOrder没有在声明时初始化,依赖循环赋值。如果输入是空字符串,循环根本不会执行,isInOrder从来没被赋值,正常情况下编译器就应该报“变量未初始化”的语法错误,你那边没报错大概率是IDE的语法检查级别设置偏低。 - 边界场景未处理:如果输入是空字符串,或者字符串长度为1,现有循环逻辑会完全失效,没有对应判断逻辑。
修正后可正常运行的代码
import java.util.Scanner; public class order { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 初始默认字符串符合有序要求,后续遇到不符合的情况再置为false boolean isInOrder = true; System.out.println("\n\n\n\n\n<EV> \"Hello sir, please enter a string value for me ;)\" \n"); String stringInput = scan.nextLine(); System.out.println("\n<EV> \"You entered: " + stringInput + "\""); // 长度小于2的字符串天然满足顺序要求,无需比较 if (stringInput.length() >= 2) { // 从第二个字符开始遍历,和前一个字符对比 for (int alpha = 1; alpha < stringInput.length(); alpha++) { char prevChar = stringInput.charAt(alpha - 1); char currChar = stringInput.charAt(alpha); // 只要相邻字符里有非字母,就不符合纯字母按序的要求 if (!Character.isLetter(prevChar) || !Character.isLetter(currChar)) { isInOrder = false; break; } // 统一转大写忽略大小写差异,避免ASCII码差异导致的判断偏差 char prevUpper = Character.toUpperCase(prevChar); char currUpper = Character.toUpperCase(currChar); // 前一个字符的顺序大于后一个,说明字符串不是按字母序排列 if (prevUpper > currUpper) { isInOrder = false; break; } } } System.out.println("<EV> \"It seems that the string you provided is...\" \n"); // 使用双等号做相等判断,不要混用赋值运算符 if (!isInOrder) { System.out.println("<EV> \"NOT alphabetical!\""); } else { System.out.println("<EV> \"Alphabetical!\"\n"); } System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); scan.close(); } }
内容的提问来源于stack exchange,提问作者Sleep
相关产品推荐
相关产品推荐

