【问题标题】:Java - Creating batch of comma separated valuesJava - 创建一批逗号分隔值
【发布时间】:2016-03-10 05:23:10
【问题描述】:

我有一个逗号分隔值的字符串,并且该初始字符串可以包含任意数量的逗号分隔值。我需要以这样的方式创建一个程序,以便如果字符串中有 100 个逗号分隔值,那么我可以获得 5 个不同的字符串,每个字符串包含 20 个逗号分隔值。同样,如果初始字符串中有 200 个逗号分隔值,那么我可以获得 10 个字符串,每个字符串有 20 个逗号分隔值。

这是我为获取 csv 计数所做的工作:

public int getCSVCount(String CSV) {

    String[] CSVArray = CSV.split(",");
    int number;
    if(CSV == null || CSV.isEmpty()){
        number = 0;
    }else{
        number = CSVArray.length;
    }
    return number;
}

请帮帮我。

【问题讨论】:

  • 字符串中允许的字符是什么?我做了这个little demo 来检查你是否想要类似的东西。我已经将 25 个字母分成 5 个一组。所以匹配项不是 5 个,每个匹配项有 5 个 csv 值。
  • 您应该在拆分字符串之前检查空/空。否则,如果字符串为空,您将获得 NPE。
  • 请注意命名约定。你的变量命名伤害了我的眼睛
  • 还有,包含 103 个逗号的数组呢?你应该得到什么?

标签: java regex string csv


【解决方案1】:
public String[] getString(String CSV) {

    String[] output ;
    String[] CSVArray = CSV.split(",");
    int number;
    if(CSV == null || CSV.isEmpty()){
        number = 0;
    }else{
        number = CSVArray.length;
    }

    Int count = 1;
    Int j = 0;
    for (int i : CSVArray)
    {
        if (count >20)
        {
            j = j+ 1;
            count = 0;
        }
        output[j] = output[j] + ","+ CSVArray[i];
    }

    return output;
}

这是一个做事的简单例子。 我没有执行它。

我的假设是您想要一个包含 20 个逗号分隔值的字符串。

如果计数为 100,那么您将拥有 5 个字符串的数组,大小为 20 个逗号分隔值

以上对你有帮助

【讨论】:

  • 加一个用于空检查。
【解决方案2】:

这里你去所有测试和工作

import java.util.ArrayList;

public class test {

    ArrayList<String> stringOf100 = new ArrayList<String>();
    ArrayList<String> stringOf200 = new ArrayList<String>();

    public test() {


        for (int i = 1; i <= 200; i++) {
        stringOf200.add(i + ",");
    }

    for (int i = 1; i <= 100; i++) {
        stringOf100.add(i + ",");
    }

    stringOf100.size(); // = 100

    for (String string : stringOf100) {
        System.out.println(string);
    }
    /* prints this.
    1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
    78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
    */

    filter(stringOf100);
//      filter(stringOf200);



}

    private void filter(ArrayList<String> strings) {
        int outputCommaValues = 20; //as i understood this is a constant of 20.  "different strings each containing 20 comma separated values."
        int outputStrings = strings.size() / outputCommaValues; //5 or 10 or 5/100 = 0.05 -> 0.05*strings.size if strings.size = 100 -> 0.05*100 = 5 if strings.size = 200 -> 0.05*200 = 10. not sure what you want this to be

        ArrayList<String> output = new ArrayList<String>();

        StringBuilder sb = new StringBuilder();

        int c = 0;
        for (int i = 1; i <= outputStrings; i++) { 
            for (int j = 1; j <= outputCommaValues; j++) {
                if (strings.get(c) != null) {
                    sb.append(strings.get(c));
                    c++;
                } 
            }
            output.add(sb.toString());
            sb.delete(0, sb.length());
        }

        System.out.println(" c: " + c);
        System.out.println(" size: " + output.size());

        for (String string : output) {
            System.err.println(string);
        }

        /* stringOf100 outputs 5 strings:
         1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,            
         21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,   
         41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,   
         61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,   
         81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,  
         */


        /* stringOf200 outputs 10 strings:
         1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
         21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
         41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
         61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
         81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,
         101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,
         121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,
         141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,
         161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,
         181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,
     */

    }

}

【讨论】:

    【解决方案3】:

    对你来说应该不难

    1. 用逗号分割字符串
    2. 对于每 20 个字符串,使用逗号将它们连接起来,并将其放入结果数组/列表中

    如果您对第三方库开放,通过使用例如 Apache Commons Collections + Commons Lang 将使任务变得非常简单

    伪代码:

    List<List<String>> csvValueGroups = ListUtils.partition(Arrays.asList(csv.split(',')), 20);
    List<String> result = new ArrayList<String>(csvValueGroups.size());
    for (List<String> group : csvValueGroups) {
        result.add(StringUtils.join(group, ","));
    }
    

    【讨论】:

      【解决方案4】:

      未检查代码

      final String SEPERATOR  = " ";
      List<String> strings = new      ArrayList<>();
      StringBulder builder;
      for(int i =0; i<number ;i++){
      if((i % 20) ==0){
      if(i!=0){
      strings.add(builder.toString());
      }
      builder = new StringBuilder();
      }
      builder.append(CSVArray[i]);
      /* If (i+1) %20 is zero it means it is the last string in this 20 we dont want aeperatot after it */if((i+1)%20) !=0){
      builder.append(SEPERATOR);
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        相关资源
        最近更新 更多