我编写了一个简单的程序来解析格式为field1(sf1),field2(sf1,sf2),field3[Detail],field4(sf1,sf2)
的字符串。
private void tokenizeUsingDeque(final char[] array, final List<String> container) {
final Deque<Character> stack = new ArrayDeque<>();
boolean leftBraceFound = false;
final StringBuilder builder = new StringBuilder();
for(int i = 0; i < array.length; i++) {
stack.addLast(Character.valueOf(array[i]));
if(array[i] == '(') {
leftBraceFound = true;
}
if(array[i] == ',') {
if(!leftBraceFound) {
stack.removeLast(); // Do not add the comma.
builder.setLength(0);
// Pop until stack is clear
for (final Character nextChar : stack) {
builder.append(nextChar);
}
container.add(builder.toString());
stack.clear();
}
}
if(array[i] == ')') {
if(leftBraceFound) {
builder.setLength(0);
// Pop until stack is clear
for (final Character nextChar : stack) {
builder.append(nextChar);
}
container.add(builder.toString());
stack.clear();
leftBraceFound = false;
}
}
}
if(!stack.isEmpty()) {
// Pop until stack is clear
for (final Character nextChar : stack) {
builder.append(nextChar);
}
container.add(builder.toString());
stack.clear();
}
}
奇怪的是,对于上面提到的字符串,container
数组列表包含以下元素(注意额外的空字符)
container(0) --> "field1(sf1)"
container(1) --> ""
container(2) --> "field2(sf1,sf2)"
container(3) --> ""
container(4) --> "field3[Detail]"
container(5) --> "field4(sf1,sf2)"
有人可以帮我理解为什么那些额外的太空人物会来吗?
谢谢,NN
答案 0 :(得分:1)
您在“)”之后和“,”之后将文本添加到容器中。 在“)之后,您添加了正确的文本并重置”堆栈“。然后你得到“,”并将“堆栈”添加到容器中,但此时堆栈是空的
答案 1 :(得分:1)
问题是您要为输入中的每个字符串向容器添加两次字符串。
当你遇到'(',你输入字符串到容器,并重置'leftBraceFound'标志。
在此之后,您会在重置标志时遇到',',因此您输入'if'语句块。此时,除了弹出的逗号字符外,堆栈中没有任何内容,然后您创建一个空字符串并将其添加到容器中。
您应该更改“if(array [i] ==',')”块以不添加新字符串,或者如果您预期逗号之间的字符串未包含在括号中,则需要将循环更改为检查逗号并完全忽略括号。