如何避免使用new char[string.length()]实现字符串反转与回文判断?
关于Java文本反转程序的两个问题解答
问题1:为何循环中需要第二个!input.toLowerCase().equals("stop")判断?
你的初始input是空字符串,第一次while循环条件!input.toLowerCase().equals("stop")会成立,进入循环后先提示输入,再读取用户输入到input。如果用户输入的是stop,要是没有第二个判断,程序会直接执行反转、回文判断的逻辑——这显然不符合“输入stop就停止”的需求。
第二个判断的核心作用就是:读取到stop后,跳过后续的文本处理逻辑,直接回到while循环的条件判断。此时input是stop,循环条件不成立,程序正常退出。
其实可以优化循环结构,避免重复判断,比如用while(true)加break的写法,逻辑更直观:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input; while (true) { System.out.println("Enter some text:"); input = scanner.nextLine(); if (input.toLowerCase().equals("stop")) { break; } // 处理文本逻辑 String reversed = reverseString(input); System.out.println("Reversed: " + reversed); if (isPalindrome(input)) System.out.println("That's a palindrome!"); } }
问题2:替代new char[string.length()]的简洁方案
针对reverseString方法
Java标准库提供了现成的简洁实现,用StringBuilder的reverse()方法一行搞定,完全不需要手动操作char数组:
public static String reverseString(String string) { return new StringBuilder(string).reverse().toString(); }
如果不想用StringBuilder,也可以用递归或substring循环拼接(不过递归对超长字符串可能栈溢出,循环拼接效率不如StringBuilder):
// 递归实现 public static String reverseString(String string) { if (string.isEmpty()) return string; return reverseString(string.substring(1)) + string.charAt(0); } // substring循环拼接 public static String reverseString(String string) { String reversed = ""; for (int i = string.length() - 1; i >= 0; i--) { reversed += string.charAt(i); } return reversed; }
针对normalizeString方法
用StringBuilder动态添加符合条件的字符,比预先分配char数组更灵活高效,还不用手动截断:
public static String normalizeString(String string) { StringBuilder sb = new StringBuilder(); for (char c : string.toCharArray()) { if (Character.isLetter(c)) { sb.append(Character.toLowerCase(c)); } } return sb.toString(); }
也可以用Java 8+的Stream API实现,代码更简洁:
import java.util.stream.Collectors; public static String normalizeString(String string) { return string.chars() .filter(Character::isLetter) .mapToObj(c -> String.valueOf((char) Character.toLowerCase(c))) .collect(Collectors.joining()); }
内容的提问来源于stack exchange,提问作者Hadzet
相关产品推荐
相关产品推荐

