【问题标题】:Is there any other way to remove all whitespaces in a string?有没有其他方法可以删除字符串中的所有空格?
【发布时间】:2021-03-30 03:22:11
【问题描述】:

我有一个编程作业。它说我需要先反转字符串,然后将其更改为大写,然后删除所有空格。我确实做到了,但是我们的教授没有说使用replaceAll()方法。除了replaceAll(),还有其他方法吗?

这是我的代码:

public static void main(String[] args) {
    String line = "the quick brown fox";
    String reverse = "";

    for (int i = line.length() - 1; i >= 0; i--) {
        reverse = reverse + line.charAt(i);
    }
    System.out.println(reverse.toUpperCase().replaceAll("\\s", ""));
}

【问题讨论】:

    标签: java string replace whitespace


    【解决方案1】:

    您可以使用Character.isWhitespace 依次检查每个字符。此外,在循环内连接时,通常最好使用StringBuilder

    public static void main(String[] args) {
        String line = "the quick brown fox";
        StringBuilder sb = new StringBuilder(line.length());
    
        for (int i = line.length() - 1; i >= 0; i--) {
            char c = line.charAt(i);
            if(!Character.isWhitespace(c)) sb.append(Character.toUpperCase(c));
        }
        System.out.println(sb);
    }
    

    【讨论】:

      【解决方案2】:

      @Khelwood 以代码形式回答:

      public static void main(String[] args) {
          String line = "the quick brown fox";
          String reverse = "";
      
          for (int i = line.length() - 1; i >= 0; i--) {
              char currentChar = line.charAt(i);
              if (currentChar != ' ') {
                  reverse += currentChar;
              }
          }
          System.out.println(reverse.toUpperCase());
      
      }
      

      【讨论】:

        【解决方案3】:

        Character#isWhitespace

        初始化一个StringBuilder 对象并遍历大写字符串的每个字符。迭代时,使用Character#isWhitespace 检查字符是否为空白字符。如果不是,则将该字符附加到StringBuilder 对象。循环结束后,StringBuilder 对象将包含除空白字符之外的所有字符。

        public class Main {
            public static void main(String[] args) {
                String line = "the quick brown fox";
                String reverse = "";
        
                for (int i = line.length() - 1; i >= 0; i--) {
                    reverse = reverse + line.charAt(i);
                }
                String upperCased = reverse.toUpperCase();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < upperCased.length(); i++) {
                    char ch = upperCased.charAt(i);
                    if (!Character.isWhitespace(ch)) {
                        sb.append(ch);
                    }
                }
        
                System.out.println("The given string: " + line);
                System.out.println("The reverse of the given string: " + reverse);
                System.out.println("The reverse of the given string in UPPER case: " + upperCased);
                System.out.println("After removing all space from the reverse of the given string in UPPER case: " + sb);
            }
        }
        

        输出:

        The given string: the quick brown fox
        The reverse of the given string: xof nworb kciuq eht
        The reverse of the given string in UPPER case: XOF NWORB KCIUQ EHT
        After removing all space from the reverse of the given string in UPPER case: XOFNWORBKCIUQEHT
        

        注意:

        1. 如果要将sb 转换为String,请使用sb.toString()
        2. 您可以使用String 而不是StringBuilder,但对于这种情况,我建议您使用StringBuilder 而不是String,因为循环中重复的字符串连接会产生与数量一样多的String 实例的串联。查看this discussion 了解更多信息。

        【讨论】:

          【解决方案4】:

          严格遵守教授的描述(和意图?):

          public static void main(String[] args) {
              String line = "the quick brown fox";
          
              String reverse = "";
              for (int i = line.length() - 1; i >= 0; i--) {
                  reverse = reverse + line.charAt(i);
              }
          
              String upperCase = reverse.toUpperCase();
          
              String noSpaces = "";
              for (int i = 0; i < upperCase.length(); i++) {
                  char ch = upperCase.charAt(i);
                  if (!Character.isWhitespace(ch)) {
                      noSpaces = noSpaces + ch;  // or noSpaces += ch;
                  }
              }
          
              System.out.println(noSpaces);
          }
          

          注意 1:这一切都可以通过一个循环来完成,但这与 描述 不匹配(或者根本没有(用户)循环?)。

          注2:不再需要使用StringBuilder(使用实际Java版本(> = 11)时)-实际上我相信不使用它更有效,编译器做得更好(见StringConcatFactory

          注3:如果允许使用StringBuilder,它还有一个reverse方法

          注意 4:请注意(将来)replaceAll() 与正则表达式一起使用,非常强大,但只是替换一个字符有点矫枉过正 - replace() 会更温和

          【讨论】:

          • StringConcatFactory 明确声明它是为已知数量的输入创建连接器;在循环中使用与其描述不符。
          • @chrylis 已知输入数 是这种情况,还是?该代码只是连接 两个 字符串 - 上述代码的连接类似于noSpaces = $concat2(noSpaces, ch); (方法名称不正确,如示例)((如果您不相信,请检查生成的代码反编译器))
          • @chrylis 使用工厂并没有消除循环,只是消除了 StringBuilder 的(隐藏)使用 - 详细信息:JEP280
          • “在循环中使用StringBuilder”的全部意义在于避免在每次循环迭代时创建新的String 对象。 “我们正在创建所有这些新对象略快”并不能避免这一点。
          • @chrylis 不是 100% 正确的,关键还在于避免每次迭代都创建一个新的 SrtingBuilder (和一些数组)。不知道最后一条评论与您的​​第一条评论或我的 cmets 有何关系……不知何故,我认为 OP 还不应该了解(微)优化它看起来更像是老师想要教授 for 循环之类的基础知识, if 声明和那个...
          【解决方案5】:

          即使不使用replaceAll(),它仍然是单行:

          String reverse =
                  new StringBuilder(line)
                          .reverse()
                          .toString()
                          .toUpperCase()
                          .replace(" ", "");
          

          【讨论】:

            【解决方案6】:

            这里有两种方法。第一个使用标准循环。

            String line = "the quick brown fox";
            StringBuilder sb = new StringBuilder();
            for (int i = line.length() - 1; i >= 0; i--) {
                char ch;
                if ((ch = line.charAt(i)) != ' ') {
                    sb.append(Character.toUpperCase(ch));
                }
            }
            System.out.println(sb.toString());
            

            打印

            XOFNWORBKCIUQEHT
            

            第二个使用StringBuilderreplaceAll。不管怎样,你应该问你的教授,因为没有什么是公开禁止的。

            String str = new StringBuilder("the quick brown fox")
                    .reverse().toString().replaceAll("\\s+", "").toUpperCase();
            
            System.out.println(str);
            

            也打印

            XOFNWORBKCIUQEHT
            

            【讨论】:

              【解决方案7】:

              您可以使用String.codePoints 方法迭代此字符串的字符的int 值,以颠倒它们的顺序,更改为大写并删除空格:

              String line = "the quick brown fox";
              
              String reverse = line
                      // return IntStream
                      .codePoints()
                      // return Stream<Character>
                      .mapToObj(ch -> (char) ch)
                      // reverse the order
                      // of characters once
                      .sorted((ch1, ch2) -> -1)
                      // change to uppercase
                      .map(Character::toUpperCase)
                      // remove whitespaces
                      .filter(ch -> !Character.isWhitespace(ch))
                      // return Stream<String>
                      .map(String::valueOf)
                      // join strings with
                      // characters back
                      // to a single string
                      .collect(Collectors.joining());
              
              System.out.println(reverse); // XOFNWORBKCIUQEHT
              

              另见:Is there a way to reverse specific arrays in a multidimensional array?

              【讨论】:

                【解决方案8】:

                如果您不需要存储反转的行,您也可以将其向后迭代并立即打印字符。

                public static void main(String[] args) {
                    String line = "the quick brown fox";
                    for (char c : line.toUpperCase().toCharArray()) {
                        if (!Character.isWhitespace(c)) {
                            System.out.print(c);
                        }
                    }
                }
                

                【讨论】:

                  【解决方案9】:

                  您可以在字符索引上以相反的顺序iterate,将它们转换为大写并删除空格,如下所示:

                  String str = "the quick brown fox";
                  String reverse = IntStream
                          // iterate over characters in reverse order
                          .iterate(str.length() - 1, i -> i >= 0, i -> i - 1)
                          // take a character by its index
                          .mapToObj(str::charAt)
                          // filter only letters
                          .filter(Character::isLetter)
                          // character to uppercase
                          .map(Character::toUpperCase)
                          // Stream<String>
                          .map(String::valueOf)
                          // concatenate into one line
                          .collect(Collectors.joining());
                  
                  // output
                  System.out.println(reverse); // XOFNWORBKCIUQEHT
                  

                  【讨论】:

                    【解决方案10】:

                    如果动作顺序无关紧要,那么您可以先将此字符串更改为大写,然后在字符代码点上并过滤掉空格,然后以相反的顺序连接剩余的字符:

                    String line = "the quick brown fox";
                    String reverse = line
                            // upper case String
                            .toUpperCase()
                            // IntStream over the character code points
                            .codePoints()
                            // filter out the space characters
                            .filter(ch -> !Character.isSpaceChar(ch))
                            // Stream<String>
                            .mapToObj(Character::toString)
                            // concatenate characters in reverse order
                            .reduce((a, b) -> b + a)
                            .orElse(null);
                    
                    System.out.println(reverse); // XOFNWORBKCIUQEHT
                    

                    【讨论】:

                      猜你喜欢
                      • 2011-11-15
                      • 2022-03-07
                      • 2010-12-05
                      • 2012-01-06
                      • 2019-11-25
                      相关资源
                      最近更新 更多