【问题标题】:How to control adding of delimiter (,) in string iteration如何控制在字符串迭代中添加分隔符(,)
【发布时间】:2015-08-20 09:40:42
【问题描述】:

我正在使用此代码从数组列表中获取值。检索到数据后,我想在其后连接一个 (,)。如果检索到的数据会使整个字符串的长度计数大于 160,则数据的连接将停止。之后,我想停止添加逗号,因为后面不会有数据。我该怎么做?

 List<Pending> pending = db.getAllPending();
 List<String> resultingStrings = new ArrayList<String>();
 String a = "";
 for (Pending pn : pending) {
     if (a.length() + pn.getPm_str().length() <= 160) {
         a+=pn.getPm_str();
         a+=",";
     } else {
         resultingStrings.add(a);
          a = pn.getPm_str();
     }
 }
 resultingStrings.add(a);

输出

RBSN/C1/12/3/4/8,CVTE/C1/2/3/4/1,RBSN/C1/4/2131/331/12,RBSN/C1/45/67/12/44 ,RBSN/C1/44/231/123/23213,RBSN/C1/444/55522/222/11,RBSN/C1/123/123/213123/1231232,

最后一个连接的数据后面有一个逗号。 总字符串长度:146

预期输出

RBSN/C1/12/3/4/8,CVTE/C1/2/3/4/1,RBSN/C1/4/2131/331/12,RBSN/C1/45/67/12/44 ,RBSN/C1/44/231/123/23213,RBSN/C1/444/55522/222/11,RBSN/C1/123/123/213123/1231232

最后一个数据连接后没有逗号。 总字符串长度:145

【问题讨论】:

  • 您需要进行测试,以确保您不会在列表中的最后一个条目中添加逗号。
  • 没错。这就是我需要的。
  • 我误会了,我以为您需要帮助了解如何解决问题,而不是为您编写代码。

标签: java


【解决方案1】:

不要在添加元素之后添加逗号,而是在添加之前添加它,这样你就不会在末尾有逗号。

List<Pending> pending = db.getAllPending();
List<String> resultingStrings = new ArrayList<String>();
String a = "";
for (Pending pn : pending) {
  if (a.length() + pn.getPm_str().length() < 160) { // < to leave room for the comma as well
        if(a.length() != 0) { // don't add a comma before the first 1
          a+=",";
        }
        a+=pn.getPm_str();
  } else {
        resultingStrings.add(a);
        a = pn.getPm_str();
  }
}
resultingStrings.add(a);

【讨论】:

    【解决方案2】:

    在 else 语句中添加一行:

    List<Pending> pending = db.getAllPending();
    List<String> resultingStrings = new ArrayList<String>();
    String a = "";
    
    for (Pending pn : pending) {
        if (a.length() + pn.getPm_str().length() <= 160) {
            a+=pn.getPm_str();
            a+=",";
        }
        else {
            a = a.substring(0, a.length()-1)  <-----
            resultingStrings.add(a);
            a = pn.getPm_str();
        }
    }
    resultingStrings.add(a);
    

    【讨论】:

      【解决方案3】:

      这称为尾随逗号问题。有很多方法可以解决这个问题。

      一种方法是获取最后一个字符串并删除最后一个字符:

      s = s.substring(0, s.length()-1);
      

      另一种方法是将循环转换为常规 for 循环,并在添加逗号之前检查它是否不在末尾。

       List<Pending> pending = db.getAllPending();
       List<String> resultingStrings = new ArrayList<String>();
       String a = "";
       for (int i = 0; i < pending.size(); i++) {
           Pending p = pending.get(i);
           if (a.length() + pn.getPm_str().length() <= 160) {
               a+=pn.getPm_str();
               if(i != pending.size()-1){
                   a+=",";
               }
           } else {
               resultingStrings.add(a);
                a = pn.getPm_str();
           }
       }
       resultingStrings.add(a);
      

      【讨论】:

        【解决方案4】:

        使用StringBuilder(为了提高效率),只在必要时插入逗号。

        List<Pending> pending = db.getAllPending();
        List<String> resultingStrings = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        for (Pending pn : pending) {
            final String str = pn.getPm_str();
            if (sb.length() > 0) {
                sb.append(',');
            }
            if (sb.length() + str.length() <= 160) {
                sb.append(str);
            } else {
                resultingStrings.add(sb.toString());
                sb.setLength(0);
                sb.append(str);
            }
        }
        resultingStrings.add(sb.toString());
        

        【讨论】:

          【解决方案5】:

          为什么不直接添加到resultingString列表呢?由于 List 存储用逗号分隔的字符串,因此您无需自己进行操作。并且您可以计算使用resultingString.toString().length() 存储的字符串的长度。

          List<Pending> pending = db.getAllPending();
          List<String> resultingStrings = new ArrayList<String>();
          for (Pending pn : pending) {
               // 162 considering the starting and closing brackets
               if ((resultingStrings.toString().length()+pn.getPm_str())<= 162) {
                   resultingStrings.add(pn.getPm_str());
                }
            }
          

          【讨论】:

            【解决方案6】:

            使用 StringBuilder。字符串准备好后,删除最后一个字符,将其转换为 String 即可。

            List<Pending> pending = db.getAllPending();
             List<String> resultingStrings = new ArrayList<String>();
             StringBuilder a = new StringBuilder;
             for (Pending pn : pending) 
                 if (a.length() + pn.getPm_str().length() <= 160) {
                     a.append(pn.getPm_str()).append(",");
                 }
                 else {
                     a.deleteCharAt(a.length());
                     resultingStrings.add(a);
                     a = new StringBuilder();
                     a.append(pn.getPm_str());
                 }
             a.deleteCharAt(a.length());
             resultingStrings.add(a.toString());
            

            【讨论】:

            • 这种方法不会捕获所有待处理的值。
            • 什么意思?他们想在 160 长度后停止。
            • 查看问题中的代码,很明显他们想要捕获所有待处理的值(在每个最多 160 个字符的单独字符串中)。
            猜你喜欢
            • 1970-01-01
            • 2021-11-17
            • 2015-11-21
            • 2013-10-30
            • 1970-01-01
            • 2021-02-07
            • 2018-11-27
            • 1970-01-01
            • 2013-10-09
            相关资源
            最近更新 更多