【问题标题】:Inserting characters in a string via for loop通过for循环在字符串中插入字符
【发布时间】:2017-01-27 17:02:53
【问题描述】:

我想用 for 循环在字符串中插入字符。我知道如何在没有 for 循环的情况下做到这一点:

String s = "Hello";
String x = " ";
x = s.substring(0, 1) + "*" +s.substring(1, 2) + "*" + s.substring(2,3) +"*"+s.substring(3,4) +"*" +s.substring(4,5);
System.out.println(x);

但是现在当涉及到循环执行时,我遇到了问题。我的方法如下:

String y ="";
for(int i= 0; i<=s.length(); i++){
    y = s.substring(0, i) + "*" +s.substring(i);
}
System.out.println(y);

【问题讨论】:

  • 一定要循环吗?
  • String y = s.replaceAll("(?!^|$)", "*");

标签: java string loops


【解决方案1】:

在 Java 8+ 中,您可以执行以下操作

String x = "Hello";
String result = Stream.of(x.split(""))
                      .collect(Collectors.joining("*"));

结果H*e*l*l*o

基本上,您正在创建一个长度为 1 的字符串流,并使用收集器收集它们,该收集器使用 * 连接它们。在这种方法中,您不必考虑任何特殊情况,例如最后一个/第一个元素或从末尾删除额外的 * 等。

【讨论】:

    【解决方案2】:
            String s = "Hello";
            String x = String.join("*",s.split(""));
            System.out.println(x);
    

    【讨论】:

      【解决方案3】:

      怎么样:

          String input = "TestInput";
      
          StringBuilder b = new StringBuilder();
          b.append(input.charAt(0));
          for (int i = 1; i < input.length(); i++) {
              b.append("*").append(input.charAt(i));
          }
          System.out.println(b);
      }
      

      给予:

      T*e*s*t*I*n*p*u*t
      

      这是你想要的吗?

      编辑: Pshemo 的建议——使用StringJoiner(Java 8 解决方案)

      StringJoiner sj = new StringJoiner("*");
              for (int i = 0; i < input.length(); i++) {
                  sj.add(input.substring(i, i + 1));
              }
              System.out.println(sj.toString());
      

      并且没有StringBuilder 版本:

        String input="TestInput";
          String y = "";
          for (int i = 0; i < input.length(); i++) {
              y += "*" + input.charAt(i);
          }
      

      据您所知 - 不鼓励使用字符串连接。最好使用StringBuilderStringJoiner

      【讨论】:

      • 或者从 Java 8 开始,我们可以使用 StringJoiner* 作为分隔符。
      • 是的,这基本上就是我想要的。我对 java 很陌生,我还不知道 append 方法。没有.append可以吗?
      【解决方案4】:

      您可以使用charAt 方法,在您的第二个代码中,请注意字符串边界,而不是获取StringIndexOutOfBoundException

      String x = "Hello";
      String y =String.valueOf(x.charAt(0));
      for(int i= 1; i<x.length(); i++)
         y += "*"+x.charAt(i);
      System.out.println(y);
      

      我的建议是使用 StringBuilder 而不是 String ,它更高效

      String x = "Hello";
      StringBuilder y = new StringBuilder(String.valueOf(x.charAt(0)));
      for(int i= 1; i<x.length(); i++)
         y.append("*").append(x.charAt(i));
      System.out.println(y);
      

      在这个例子中,两个代码的输出都是H*e*l*l*o

      【讨论】:

      • 几个问题:(1)您的示例无法编译,(2)它们不会提供预期的结果。此外,我们并不是真的必须使用charAt,还有其他方式。
      • 只有第一个示例符合 OP 的预期。 new StringBuilder(x.charAt(0)) 没有做你认为的事情。提示:没有StringBuilder(char) 构造函数,而是使用StringBuilder(int)
      • 使用StringBuilder 通常更有效,而通过new StringBuilder(String.valueOf(x.charAt(0))) 初始化则不然。为什么不StringBuilder y = new StringBuilder().append(x.charAt(0));
      • @Holger 没有理由,你的解决方案更好,我的比你的慢
      【解决方案5】:
      public static String insertChar(String str, char character){
      
          char[] charArray=str.toCharArray();
          String result="";
          for(int i=0;i<charArray.length;i++){
              result=result+charArray[i];
              if(i<charArray.length-1){
                  result=result+character;
              }
          }
          return result;
      }
      

      System.out.println(insertChar("Hello",'*'));

      【讨论】:

        【解决方案6】:

        您可以按照以下代码 sn-p 使用循环(如您所述)将字符添加到字符串。

            String s = "HelloWorld";
            String y ="";
            Character c = '*';
            int length = s.length();
        
            for(int i = 1; i<= length; i++) {
                if(i == length)
                    y += s.substring(i-1, i);
                else
                    y += s.substring(i-1, i) + c;
            }
        
            System.out.println(y);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-13
          • 1970-01-01
          • 2013-11-23
          • 2014-08-24
          • 2013-10-05
          • 1970-01-01
          相关资源
          最近更新 更多