【问题标题】:How to append string dynamically? [duplicate]如何动态追加字符串? [复制]
【发布时间】:2014-08-02 10:45:54
【问题描述】:

您好,我的要求是生成以下字符串:

qid<> 0 And qid<> 1 And qid<> 2 And qid<> 3 And qid<> 4 And qid<> 5 And qid<> 6 And qid<> 7 And qid<> 8 And qid<> 9 

所以我这样做了:

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
       String deleteQids="qid<> ";
       String deleteqidString1="";

       for(int i=0;i<10;i++) {
         deleteqidString1+=deleteQids+i +" And ";
       }
       System.out.println(deleteqidString1);
    }
}

http://ideone.com/dpFfxF

但最后出现

谁能告诉我如何摆脱这个?

【问题讨论】:

  • 使用StringBuilder开始
  • 添加条件以检查当前迭代是否为最后一次,并且仅在条件为假时添加“与”。
  • 请注意,C# 有一个方便的 string.Join 方法,您可以在列表的每个元素之间添加 " and ",这个答案提供了在 java 中执行相同操作的想法:stackoverflow.com/questions/187676/…

标签: java string


【解决方案1】:

下面给出的代码 sn-p 完成了这项工作。它为每次迭代添加“和”,除了最后一个,即。当 i 等于 9 时。

String deleteQids="qid<> ";
String deleteqidString1="";
for(int i=0;i<10;i++)
{
    deleteqidString1 += deleteQids + i ;
    if (i < 9) deleteqidString1 += " And ";
} 

【讨论】:

  • 请指出 OP 你做了什么,并解释你的代码在做什么。
  • 编辑了答案。希望对您有所帮助。
  • +1,感谢您的澄清。
【解决方案2】:

使用此代码

   String deleteQids="qid<> ";
   String deleteqidString1="";

   for(int i=0;i<10;i++) {
      if(i!=9)
  {   
     deleteqidString1+=deleteQids+i +" And ";
 }
 else
 {
     deleteqidString1+=deleteQids+i +"";
 }
   }
   System.out.println(deleteqidString1);
  }

【讨论】:

    【解决方案3】:

    如果您的迭代次数固定为 10 次,则

    比尝试这个可能会有所帮助,这不是最佳的方法,但你仍然可以获得你想要的

    如果迭代固定为 10

    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
        public static void main (String[] args) throws java.lang.Exception
        {
            // your code goes here
                    String deleteQids="qid<> ";String deleteqidString1="";
    for(int i=0;i<10;i++)
    {
                if(i==9)
                {
                     deleteqidString1+=deleteQids+i ;
                }
                else
                {
                     deleteqidString1+=deleteQids+i +" And ";
                }
    
    
    }
    System.out.println(deleteqidString1);
        }
    }
    

    【讨论】:

    • 感谢+1的回答
    【解决方案4】:

    如果您对字符串进行大量操作,请始终使用 StringBuilder,因为它更有效。

      int qids = -1;
      StringBuilder sb = new StringBuilder();
    
      if(qids>=0) {
        for(int i=0;i<qids-1;i++)
        {
          sb.append("qid<> ");
          sb.append(i);
          sb.append(" And ");
    
        }
    
        sb.append("qid<> ");
        sb.append(qids);
      }
    
      System.out.println(sb.toString());
    

    【讨论】:

    • 仅供参考-假设至少有一个qid
    • 你是对的,但现在不是
    • 感谢您的回答,+1
    【解决方案5】:

    如果您在循环的最后一次迭代中,或者在完成循环后修改字符串以将其删除,请更改您的逻辑以不附加该“And”。
    这些基本上是您的 2 个选项,您的选择取决于个人喜好和确切的应用程序逻辑。
    在这个简单的例子中,我会选择第一个,在更现实的场景中,使用 StringBuilder 和 Iterator 在一些 Collection 上构造 String,第二个选项通常更容易实现,当然也更容易阅读。

    所以类似于

    deletequidString1 += deleteQuids+1;
    if (i < 10) deleteQuidString1 += " And ";
    

    将是您最好的选择。

    【讨论】:

      【解决方案6】:

      您可以简单地使用String#substringString 中删除最后一个" And ",但更有效的方法是在索引大于时使用StringBuilder 和“前缀”" And "0为例

      String deleteQids = "qid<> ";
      StringBuilder sb = new StringBuilder(128);
      for (int i = 0; i < 10; i++) {
          if (i > 0) {
              sb.append(" And ");
          }
          sb.append(deleteQids).append(i);
      
      }
      System.out.println(sb.toString());
      

      最终会打印出类似...

      qid<> 0 And qid<> 1 And qid<> 2 And qid<> 3 And qid<> 4 And qid<> 5 And qid<> 6 And qid<> 7 And qid<> 8 And qid<> 9
      

      【讨论】:

      • 对 StringBuilder 应用初始容量的原因是什么?如果您知道无论如何都会使用指定的大小,是否会更快?
      • @brimborium 是的,像ArrayListStringBuilder 在内部使用char 数组,因此当达到其限制时,需要调整数组大小,初始化初始容量可减少潜在开销本次操作
      【解决方案7】:

      你可以明确地处理第一次出现:

      String deleteqidString1 = deleteQids+i;
      for(int i=1; i < 10; i++) {
          deleteqidString1 += " And " + deleteQids + i;
      }
      

      编辑:
      如 cmets 中所述,StringBuilder 是动态构建工具的正确工具。 (不过,这不会影响解决方案的逻辑):

      StringBuilder deleteqidString1 = new StringBuilder(deleteQids).append(i);
      for(int i=1; i < 10; i++) {
          deleteqidString1.append(" And ").append(deleteQids).append(i);
      }
      

      【讨论】:

      • 我对这种方法的唯一批评是它假设至少有一个“qid”
      • @MadProgrammer 是的,同意。 OP 似乎假设了这个限制,所以我继续了。该解决方案可以很容易地改进以检查处理 0 "qid"s 的情况。
      • 是的,只是批评,不是投反对票的理由;)+1
      【解决方案8】:

      您最好为此使用 StringBuilder。然后,您必须找到一个系统来知道将“与”放在哪里。

      这里有一些提示:

      • “与”出现在整数之后。 (但不是在最后一个之后)
      • “And”后跟“qid”

      结合这些条件,你就可以构建你的字符串了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2011-08-24
        • 2020-11-02
        • 1970-01-01
        • 2015-02-08
        相关资源
        最近更新 更多