Java 使用StringTokenizer模拟String.split
我正在将现有应用程序中的代码转换为针对自定义硬件的Java1.1编译器进行编译。这意味着我不能使用Java 使用StringTokenizer模拟String.split,java,stringtokenizer,Java,Stringtokenizer,我正在将现有应用程序中的代码转换为针对自定义硬件的Java1.1编译器进行编译。这意味着我不能使用String.split(regex)将现有字符串转换为数组 我创建了一个方法,它应该给出与String.split(regex)相同的结果,但是它有一些问题,我不知道是什么 代码: private static String[] split(String delim, String line) { StringTokenizer tokens = new StringTokenizer(lin
String.split(regex)
将现有字符串转换为数组
我创建了一个方法,它应该给出与String.split(regex)
相同的结果,但是它有一些问题,我不知道是什么
代码:
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim, true);
String previous = "";
Vector v = new Vector();
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if(!",".equals(token)) {
v.add(token);
} else if(",".equals(previous)) {
v.add("");
} else {
previous = token;
}
}
return (String[]) v.toArray(new String[v.size()]);
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
样本输入:
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim, true);
String previous = "";
Vector v = new Vector();
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if(!",".equals(token)) {
v.add(token);
} else if(",".equals(previous)) {
v.add("");
} else {
previous = token;
}
}
return (String[]) v.toArray(new String[v.size()]);
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
地址:0013A2004081937F,邮编:90601234FF
样本输出:
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim, true);
String previous = "";
Vector v = new Vector();
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if(!",".equals(token)) {
v.add(token);
} else if(",".equals(previous)) {
v.add("");
} else {
previous = token;
}
}
return (String[]) v.toArray(new String[v.size()]);
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
[RM^RES][0013A2004081937F][9060][1234FF]
所需输出:
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim, true);
String previous = "";
Vector v = new Vector();
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if(!",".equals(token)) {
v.add(token);
} else if(",".equals(previous)) {
v.add("");
} else {
previous = token;
}
}
return (String[]) v.toArray(new String[v.size()]);
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
[RM^RES][0013A2004081937F][[9060][1234FF]
我试图转换的旧代码:
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim, true);
String previous = "";
Vector v = new Vector();
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if(!",".equals(token)) {
v.add(token);
} else if(",".equals(previous)) {
v.add("");
} else {
previous = token;
}
}
return (String[]) v.toArray(new String[v.size()]);
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");
for(String s : items) {
System.out.println(" [ " + s + " ] ");
}
[RM^RES][0013A2004081937F][[9060][1234FF]
几乎一切都是对的。几乎是,因为您忘记了“清除”上一个
的值。
试试这个:
if(!",".equals(token)) {
v.add(token);
previous = "";
} else if(",".equals(previous)) {
v.add("");
previous = "";
} else {
previous = token;
}
完全不使用StringTokenizer如何:
private static String[] split(String delim, String line) {
String current = line;
int index = line.indexOf(delim);
Vector vector = new Vector();
while (index != -1) {
vector.add(current.substring(0, index));
current = current.substring(index + 1);
index = current.indexOf(delim);
}
vector.add(current);
return (String[]) vector.toArray(new String[vector.size()]);
}
你可以这样试试
public static void main(String[] args) throws ParseException {
for (String s : split(",", "RM^RES,0013A2004081937F, ,9060,1234FF")) {
System.out.print(" [ " + s + " ] ");
}
}
private static String[] split(String delim, String line) {
StringTokenizer tokens = new StringTokenizer(line, delim);
String[] v = new String[tokens.countTokens()];
int i = 0;
while (tokens.hasMoreTokens()) {
v[i] = tokens.nextToken();
i++;
}
return v;
}
我认为您不应该对底层分隔符进行任何假设
public static String[] split(String line, String delim) {
Vector v = new Vector();
final String EMPTY_STRING = "";
StringTokenizer st = new StringTokenizer(line, delim, true);
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (token.equals(delim)) {
if (v.isEmpty() || v.size() > 0 && !EMPTY_STRING.equals(v.get(v.size() - 1))) {
v.add(EMPTY_STRING);
}
} else {
v.add(token);
}
}
return (String[])v.toArray(new String[v.size()]);
}
我修改了代码并进行了测试。它可以工作(不要忘了避免硬编码“,”以便您可以对任何分隔符使用该函数):
这仍然给我不正确的输出[RM^RES][0013A2004081937F][[9060][[1234FF]
尝试将previous=token
放在{}中,如果{}之后可以工作,但Andrei M已经给出了更好的解决方案。无论如何,谢谢。如果您计划使用另一个分隔符,您可能想在拆分方法中将“,”.equals(…)
替换为delim.equals(…)
。@haraldK谢谢,这是一个很好的注释,可以把问题放在一边:)这不起作用,因为我的数组也将包含分隔符。它看起来是这样的:[RM^RES][,][0013A2004081937F][,][,][,]
等等。此外,您将我的字符串更改为在逗号之间添加空格,我无法更改输入,因为这是必须遵循的协议。这不起作用,因为每次我获得分隔符时,它都会添加一个空字符串,我的数组将如下所示:[RM^RES][[0013A2004081937F][[]
等。基本上,每个逗号都将成为一个空数组槽。