【问题标题】:How to trim white space from all elements in array?如何从数组中的所有元素中修剪空白?
【发布时间】:2012-04-09 12:15:05
【问题描述】:

我只是想知道从列表的所有元素中删除空白的最佳方法是什么。

例如,如果我有String [] array = {" String", "Tom Selleck "," Fish "} 我怎样才能得到所有元素为{"String","Tom Selleck","Fish"}

谢谢!

【问题讨论】:

    标签: java arrays string


    【解决方案1】:

    试试这个:

    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();
    

    【讨论】:

      【解决方案2】:

      另一个 java 8 lambda 选项:

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

      以及没有创建新数组的丑陋但优化的版本

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

      原来的“数组”被修改了。

      【讨论】:

      • 第一个效果很好;第二个对我不起作用,因为"Local variable array defined in an enclosing scope must be final or effectively final" 换句话说,数组是由java在一个循环中定义的:for (String[] array; (array = reader.readNext()) != null;) {
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在 Java 8 中,Arrays.parallelSetAll 似乎已为此目的做好了准备:

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

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

        【讨论】:

        • 如果发帖者或任何人能够清楚地解释为什么/如何工作,那就太好了。
        • 我们有一个数组,其中包含一些带有空格的元素,例如 array[]={"AAA"," BBB "," CCC "} 然后我们使用上面的 java 8 功能并使用以下语句更新原始数组Arrays.parallelSetAll(array, (i) -> array[i].trim());现在旧数组将包含没有前导和尾随空格的所有元素。
        【解决方案5】:

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

        Java 8 Lamda 表达式解决方案:

        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 的解决方案一样

        【讨论】:

        • 只是一个小编辑:temp.forEach(e -&gt; { temp.set(temp.indexOf(e), s.trim()); });,否则它会给我一个语法错误。
        • 您实际上是在最后一行创建一个新的 ArrayList 一个新数组。使用 Java 8 有更好的方法可以做到这一点,请参阅其他答案。另外,通过indexOf 查找索引对性能来说很糟糕,如果有重复的元素会失败!
        【解决方案6】:

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

        【讨论】:

        • 记得分配回array[i]!!!!否则迭代将无效。
        • 您必须将修剪后的字符串存储在某处,但不一定在 array[i] 中。根据 OP 的需要,将它们存储在第二个数组中可能会更好
        • 他的问题 [to remove the white space from all the elements ...] 表明他想用修剪过的字符串覆盖当前值,所以如果确实如此 - 您需要将其存储回 array[i]
        【解决方案7】:

        对于那些(像我一样)在 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
        }
        

        【讨论】:

          【解决方案8】:

          不知道 OP 一开始是如何将{" String", "Tom Selleck "," Fish "} 放在一个数组中的(6 年前),我想我会分享我最终得到的结果。

          我的数组是在分隔符周围可能有额外空格的字符串上使用 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)
          

          【讨论】:

            【解决方案9】:
            String val = "hi hello prince";
            String arr[] = val.split(" ");
            
            for (int i = 0; i < arr.length; i++)
            {   
                 System.out.print(arr[i]);
            }
            

            【讨论】:

            • 您应该提供,为什么您的代码有效?也许 OP 需要额外的信息。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-18
            • 2013-07-14
            • 2012-04-16
            • 1970-01-01
            • 2010-11-14
            • 1970-01-01
            相关资源
            最近更新 更多