You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:23:17