将String(格式化为ArrayList <string>)转换为实际的ArrayList <string> </string> </string>

时间:2010-08-11 22:13:12

标签: java string struts2 arraylist

我正在尝试将String转换为ArrayList。例如,我的Struts2 webapp以类似于以下格式返回此String命名行:

[A,BB,CCC,DDDD,1,0,1](沿着这些方向)

我需要将它们转换为ArrayList,以便我可以在另一个JSP页面中预填充一些表单。我硬编码了一个将这些字符串转换为列表形式的方法:

        StringBuffer rowBuffer = new StringBuffer(row);
        int startIndex = 0;
        int endIndex = rowBuffer.indexOf(",") - 1;
        rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
        rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
        while(startIndex != -1 && endIndex != -1 && startIndex < endIndex)
        {
          String subString = rowBuffer.substring(startIndex, endIndex);

       if(subString.contains(","))
       {
          rowList.add(" ");
          startIndex = endIndex + 1;
          endIndex = rowBuffer.indexOf(",", startIndex);
       }

       else
       {
        rowList.add(subString);
        startIndex = endIndex + 2;
        endIndex = rowBuffer.indexOf(",", startIndex + 1);
       }

       if(endIndex == -1)
       {
          rowList.add(rowBuffer.substring(startIndex));
          break;
       }
    }

这适用于填充所有字段的情况。但是,假设我有一个看起来像这样的字符串:[A,BB ,,, 1,0,0](缺少第3和第4个字段),然后我得到的东西不起作用(空白元素不要注册正确,列表大小为6,应该是7)。有没有比硬编码更优雅的解决方案?如果没有,有人可以指出我如何处理空白字段的案件正确的方向?谢谢!

3 个答案:

答案 0 :(得分:1)

请试试这个:

import java.util.regex.*;

// ...

// Working code    
rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
// Create a pattern to match breaks
Pattern p = Pattern.compile("\\s*,\\s*");
// Split input with the pattern
String[] result = p.split(rowBuffer);
rowList = new ArrayList(Arrays.asList(result)); 

注意:这预先假定字符串本身不包含逗号且未引用。如果要在字段和引用值中使用逗号分析实际CSV,请不要使用正则表达式并拆分;而是使用专用的状态机CSV解析器(这里是一个例子:http://opencsv.sourceforge.net/ - 或者你可以自己滚动,如BalusC example here

答案 1 :(得分:0)

我改变了我的代码并使其工作(它可能远非最优雅的解决方案,但它对我有用......

    StringBuffer rowBuffer = new StringBuffer(row);
    int startIndex = 0;
    int endIndex = rowBuffer.indexOf(",") - 1;
    rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
    rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
    while(startIndex != -1 && endIndex != -1 && startIndex < endIndex)
    {
      String subString = rowBuffer.substring(startIndex, endIndex);

       if(subString.contains(","))
       {
          rowList.add(" ");
          startIndex = endIndex - 1;
          endIndex = rowBuffer.indexOf(", ", startIndex + 1);
       }

       else
       {
         if(subString.equals("1"))
             rowList.add("True");
         else if(subString.equals("0"))
             rowList.add("False");
         else
          rowList.add(subString);
        startIndex = endIndex + 2;
        endIndex = rowBuffer.indexOf(",", startIndex + 1);
       }

       if(endIndex == -1)
       {
          if(subString.equals("1"))
             rowList.add("True");
          else if(subString.equals("0"))
             rowList.add("False");
          break;
       }
    }

答案 2 :(得分:0)

假设格式由AbstractCollection.toString()指定,那么您可以简单地:

  • 删除周围的括号(使用简单的substring
  • 然后", " String[](逗号和空格)
  • 使用splitList<String>包裹到ArrayList<String>
    • 使用它来填充", "(如有必要)

请注意,如果元素本身可以包含 String s = "[A, BB, CCC, DDDD, 1, 0, 1]"; String[] parts = s.substring(1, s.length() - 1).split(", "); List<String> list = new ArrayList(Arrays.asList(parts)); for (String part : list) { System.out.print("{" + part + "} "); } // {A} {BB} {CCC} {DDDD} {1} {0} {1} ,则会中断。为此,该字符串必须是分隔符,而不是实际令牌的一部分。

这是一个片段来说明:

{{1}}