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

如何移除字符串数组中的多余空格并生成反转句子?

移除单词间多余空格并反转句子

我在将句子拆分为字符串数组时遇到了多处空格问题,需要移除这些多余空格来生成原句的反转句。比如输入a good example,怎么移除good和example之间的两个多余空格?

我用的Java代码如下:

public class reverseString {
    public static void main(String[] args) {
        String s = "a good   example";
        String ans = revString(s);
        System.out.println(ans);
    }
    static String revString(String s) {
        String[] arr = s.split(" ");
        List<String> list = new ArrayList<String>();
        StringBuilder ans = new StringBuilder();
        for (int i = arr.length - 1; i >= 0; i--) {
            if (arr[i] == null) {
                continue;
            } else {
                ans.append(arr[i].trim());
                // ans.append(" ");
            }
        }
        String is = ans.toString();
        return is.trim();
    }
}

预期输出是example good a,但实际得到example good a。原本想跳过空格对应的数组元素,结果还是进入了else分支。


问题根源

  1. split(" ")的行为误区:用单个空格拆分字符串时,连续的空格会生成空字符串(不是null)。比如a good example拆分后,数组是["a", "good", "", "", "example"],你的if (arr[i] == null)判断永远不会触发,空字符串会进入else分支,trim()后还是空字符串,拼接起来就保留了原来的空格长度。
  2. 拼接逻辑缺失:你注释掉了添加空格的代码,就算过滤了空元素,最后单词之间也没有空格分隔,会导致单词连在一起。

解决方法

方法一:用正则表达式拆分(最简洁)

用\\s+匹配任意数量的空白字符(包括空格、制表符等),拆分后直接得到无空元素的单词数组:

public class reverseString {
    public static void main(String[] args) {
        String s = "a good   example";
        String ans = revString(s);
        System.out.println(ans);
    }
    static String revString(String s) {
        // 匹配任意数量空白字符,自动跳过多余空格
        String[] arr = s.split("\\s+");
        StringBuilder ans = new StringBuilder();
        for (int i = arr.length - 1; i >= 0; i--) {
            ans.append(arr[i]);
            // 不是最后一个单词时添加空格,避免末尾多空格
            if (i != 0) {
                ans.append(" ");
            }
        }
        return ans.toString();
    }
}

方法二:过滤空字符串(兼容原拆分逻辑)

如果不想修改拆分规则,可以在循环里判断字符串是否为空,同时处理空格拼接:

public class reverseString {
    public static void main(String[] args) {
        String s = "a good   example";
        String ans = revString(s);
        System.out.println(ans);
    }
    static String revString(String s) {
        String[] arr = s.split(" ");
        StringBuilder ans = new StringBuilder();
        for (int i = arr.length - 1; i >= 0; i--) {
            // 跳过空字符串(连续空格生成的)
            if (arr[i].trim().isEmpty()) {
                continue;
            }
            ans.append(arr[i].trim());
            // 检查后面是否还有非空单词,有则添加空格
            boolean hasNextWord = false;
            for (int j = i - 1; j >= 0; j--) {
                if (!arr[j].trim().isEmpty()) {
                    hasNextWord = true;
                    break;
                }
            }
            if (hasNextWord) {
                ans.append(" ");
            }
        }
        return ans.toString();
    }
}

方法三:用Stream简化操作(Java 8+)

利用Java 8的Stream API和工具类,代码更简洁:

import java.util.Arrays;
import java.util.Collections;

public class reverseString {
    public static void main(String[] args) {
        String s = "a good   example";
        String ans = revString(s);
        System.out.println(ans);
    }
    static String revString(String s) {
        String[] words = s.split("\\s+");
        Collections.reverse(Arrays.asList(words));
        // 用单个空格拼接反转后的单词数组
        return String.join(" ", words);
    }
}

内容的提问来源于stack exchange,提问作者Divyansh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:43:29