我正在尝试将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)。有没有比硬编码更优雅的解决方案?如果没有,有人可以指出我如何处理空白字段的案件正确的方向?谢谢!
答案 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[]
(逗号和空格)split
将List<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}}