如何从数组的所有元素中删除空格?

46

我在想如何最好地将列表中所有元素的空格去除。

例如,如果我有String [] array = {" String", "Tom Selleck "," Fish "},我该如何将所有元素变为{"String","Tom Selleck","Fish"}

谢谢!

9个回答

62

试试这个:

String[] trimmedArray = new String[array.length];
for (int i = 0; i < array.length; i++)
    trimmedArray[i] = array[i].trim();

现在,trimmedArray包含与array相同的字符串,但没有前导和尾随空格。或者,你可以编写以下代码,在同一数组中就地修改这些字符串:

for (int i = 0; i < array.length; i++)
    array[i] = array[i].trim();

32

另一种Java 8 Lambda选项:

String[] array2 = Arrays.stream(array).map(String::trim).toArray(String[]::new);

没有创建新数组的丑陋但经过优化的版本

Arrays.stream(array).map(String::trim).toArray(unused -> array);

原始的“array”被修改了。


第一个很好用;第二个对我来说不起作用,因为“在封闭范围内定义的本地变量数组必须是final或有效final”。换句话说,该数组是由Java在以以下方式开始的循环中定义的:“for(String [] array;(array = reader.readNext())!= null;){” - Tihamer

27

在您的应用程序构建路径中添加 commons-lang3-3.1.jar。 使用以下代码片段来修剪字符串数组。

String array = {" String", "Tom Selleck "," Fish "};
array = StringUtils.stripAll(array);

21

在Java 8中,Arrays.parallelSetAll似乎已经为此目的准备就绪:

import java.util.Arrays;

Arrays.parallelSetAll(array, (i) -> array[i].trim());

这将直接修改原始数组,用lambda表达式的结果替换每个元素。


如果发帖人或任何人能清晰地解释这个代码是如何工作的,那就太好了。 - Tamias
我们有一个带有空格的元素数组,例如array[]={"AAA "," BBB "," CCC "}。然后,我们使用Java 8的功能来更新原始数组,如下所示:Arrays.parallelSetAll(array, (i) -> array[i].trim())。现在旧数组中的所有元素都没有前导和尾随空格。 - pintu
迄今为止最佳答案 - Johan

6

我知道这是一个很老的帖子,但自从Java 1.8以来,有一种更好的方法可以修剪数组中的每个字符串。

Java 8 Lambda表达式解决方案:

List<String> temp = new ArrayList<>(Arrays.asList(yourArray));
temp.forEach(e -> {temp.set((temp.indexOf(e), e.trim()});
yourArray = temp.toArray(new String[temp.size()]);

使用这种解决方案,您无需创建新数组。
就像Óscar López的解决方案一样


1
只需要进行一个小修改:temp.forEach(e -> { temp.set(temp.indexOf(e), s.trim()); });,否则会出现语法错误。 - Pantelis Sopasakis
1
实际上,在最后一行你正在创建一个新的ArrayList和一个新的数组。使用Java 8有更好的方法,可以参考其他答案。此外,使用indexOf查找索引对性能来说是很糟糕的,如果有重复元素则会失败! - Óscar López

4
您可以遍历数组中的元素,并在每个元素上调用array[i].trim()

8
记得将结果赋回给 array[i]!!!否则迭代将没有任何效果。 - amit
你需要把截取后的字符串存储在某个地方,但不一定是在array[i]中。根据 OP 的需求,将它们存储在第二个数组中可能更好。 - hehewaffles
3
他的问题【去除所有元素中的空格...】表明他想用修剪过的字符串覆盖当前值,所以如果确实是这种情况-你需要将其存回到array[i] - amit

3
对于那些(像我一样)正在寻找同样的解决方案的 Kotlin 程序员,但只找到了 Java 的解决方案- 如何在 Kotlin 中进行字符串修剪:
fun main(args: Array<String>) {
    // array definition
    val array = arrayListOf<String>(" String", "Tom Selleck "," Fish ")
    println(array) // print original -> [ String, Tom Selleck ,  Fish ]

    // remove leading and trailing spaces, result is arrayList
    val sol1 = array.map { it.trim() }
    println("sol1 = $sol1") // -> sol1 = [String, Tom Selleck, Fish]

    // remove leading and trailing spaces, result is String
    val sol2 = array.joinToString { it.trim() }
    println("sol2 = $sol2") // -> sol2 = String, Tom Selleck, Fish
}

1

不知道OP在六年前是如何将{" String", "Tom Selleck "," Fish "}存储到数组中的,我想分享一下我最终得出的结果。

我的数组是通过对一个字符串使用split函数得到的,该字符串可能在分隔符周围有额外的空格。我的解决方案是在分割点处处理这个问题。我的代码如下。经过测试,我将splitWithTrim()放入了我的项目的Utils类中。它可以处理我的用例;如果您决定使用它,您可能需要考虑会遇到哪些类型的字符串和分隔符。

public class Test {
    public static void main(String[] args) {
        test(" abc def  ghi   jkl ", " ");
        test("  abc; def  ;ghi  ; jkl; ", ";");
    }

    public static void test(String str, String splitOn) {
        System.out.println("Splitting \"" + str + "\" on \"" + splitOn + "\"");
        String[] parts = splitWithTrim(str, splitOn);
        for (String part : parts) {
            System.out.println("(" + part + ")");
        }
    }

    public static String[] splitWithTrim(String str, String splitOn) {
        if (splitOn.equals(" ")) {
            return str.trim().split(" +");
        } else {
            return str.trim().split(" *" + splitOn + " *");
        }
    }
}

运行测试应用程序的输出如下:
Splitting " abc def  ghi   jkl " on " "
(abc)
(def)
(ghi)
(jkl)
Splitting "  abc; def  ;ghi  ; jkl; " on ";"
(abc)
(def)
(ghi)
(jkl)

-3
String val = "hi hello prince";
String arr[] = val.split(" ");

for (int i = 0; i < arr.length; i++)
{   
     System.out.print(arr[i]);
}

你应该提供为什么你的代码能够工作的解释。也许提供额外信息对于问题的提出者会更有帮助。 - Wilfredo P
@Purushottam,问题是“如何从数组的所有元素中删除空格?”。您的答案并没有修剪值,而是替换了空格。在问题中,您可以看到一个单词“Tom Selleck ”,在trim()之后它应该是“Tom Selleck”,而不是“TomSelleck”。希望您明白我的意思/错误。 - smilyface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接