如何移除字符串数组中的多余空格并生成反转句子?
移除单词间多余空格并反转句子
我在将句子拆分为字符串数组时遇到了多处空格问题,需要移除这些多余空格来生成原句的反转句。比如输入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分支。
问题根源
split(" ")的行为误区:用单个空格拆分字符串时,连续的空格会生成空字符串(不是null)。比如a good example拆分后,数组是["a", "good", "", "", "example"],你的if (arr[i] == null)判断永远不会触发,空字符串会进入else分支,trim()后还是空字符串,拼接起来就保留了原来的空格长度。- 拼接逻辑缺失:你注释掉了添加空格的代码,就算过滤了空元素,最后单词之间也没有空格分隔,会导致单词连在一起。
解决方法
方法一:用正则表达式拆分(最简洁)
用\\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
相关产品推荐
相关产品推荐

