Java 将字符串(格式类似于ArrayList<;String>;)转换为实际的ArrayList<;字符串>;
我正在尝试将字符串转换为ArrayList。例如,my Struts2 webapp以类似以下格式返回名为row的字符串: [A,BB,CCC,DDDD,1,0,1](沿着这些线的东西) 我需要将它们转换为ArrayList,以便在另一个JSP页面中预填充一些表单。我硬编码了一个将这些字符串转换为列表形式的方法:Java 将字符串(格式类似于ArrayList<;String>;)转换为实际的ArrayList<;字符串>;,java,string,struts2,arraylist,Java,String,Struts2,Arraylist,我正在尝试将字符串转换为ArrayList。例如,my Struts2 webapp以类似以下格式返回名为row的字符串: [A,BB,CCC,DDDD,1,0,1](沿着这些线的东西) 我需要将它们转换为ArrayList,以便在另一个JSP页面中预填充一些表单。我硬编码了一个将这些字符串转换为列表形式的方法: StringBuffer rowBuffer = new StringBuffer(row); int startIndex = 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);
}
else
{
rowList.add(subString);
startIndex = endIndex + 2;
endIndex = rowBuffer.indexOf(",", startIndex + 1);
}
if(endIndex == -1)
{
rowList.add(rowBuffer.substring(startIndex));
break;
}
}
StringBuffer rowBuffer=新的StringBuffer(行);
int startIndex=0;
int endIndex=rowBuffer.indexOf(“,”)-1;
rowBuffer.deleteCharAt(rowBuffer.indexOf(“[”));
rowBuffer.deleteCharAt(rowBuffer.indexOf(“]);
while(startIndex!=-1&&endIndex!=-1&&startIndex
在所有字段都已填充的情况下,此操作非常有效。但是,假设我有一个如下的字符串:[a,BB,,1,0,0](第3和第4个字段丢失),然后我得到了一些不起作用的内容(空白元素注册不正确,列表的大小是6,而它应该是7)。有比硬编码更优雅的解决方案吗?如果没有,有人能告诉我如何处理带有空白字段的案例的正确方向吗?谢谢 请试试这个:
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解析器(这里有一个示例:-或者您可以使用自己的,如)请尝试以下方法:
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解析器(这里有一个例子:-或者你也可以使用自己的解析器)好吧,我对代码做了一点修改,使其正常工作(这可能远不是最优雅的解决方案,但它对我有效
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;
}
}
StringBuffer rowBuffer=新的StringBuffer(行);
int startIndex=0;
int endIndex=rowBuffer.indexOf(“,”)-1;
rowBuffer.deleteCharAt(rowBuffer.indexOf(“[”));
rowBuffer.deleteCharAt(rowBuffer.indexOf(“]”);
while(startIndex!=-1&&endIndex!=-1&&startIndex
我对我的代码做了一点修改,使其正常工作(这可能远不是最优雅的解决方案,但它对我来说很有效
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;
}
}
StringBuffer rowBuffer=新的StringBuffer(行);
int startIndex=0;
int endIndex=rowBuffer.indexOf(“,”)-1;
rowBuffer.deleteCharAt(rowBuffer.indexOf(“[”));
rowBuffer.deleteCharAt(rowBuffer.indexOf(“]);
while(startIndex!=-1&&endIndex!=-1&&startIndex
假设格式如所指定,则您可以简单地:
- 拆下周围的支架(使用简易工具)
- 然后在
(逗号和空格),“
- 使用将
包装到字符串[]
列表中
- 如有必要,使用该选项填充
ArrayList
- 如有必要,使用该选项填充
”、“
”,则此操作将中断。要使其正常工作,该字符串必须是分隔符,而不是实际标记的一部分
下面是一个片段来说明:
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}
String s=“[A,BB,CCC,DDDD,1,0,1]”;
String[]parts=s.substring(1,s.length()-1);
List List=newarraylist(Arrays.asList(parts));
用于(字符串部分:列表){
系统输出打印(“{”+部分+“}”);
}//{A}{BB}{CCC}{DDDD}{1}{0}{1}
假设格式如所指定,则您可以简单地:
- 拆下周围的支架(使用简易工具)
- 然后在
(通信,“