为什么空字符存储在Java Deque中?

时间:2014-03-11 05:20:57

标签: java deque

我编写了一个简单的程序来解析格式为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 &lt; 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

2 个答案:

答案 0 :(得分:1)

您在“)”之后和“,”之后将文本添加到容器中。 在“)之后,您添加了正确的文本并重置”堆栈“。然后你得到“,”并将“堆栈”添加到容器中,但此时堆栈是空的

答案 1 :(得分:1)

问题是您要为输入中的每个字符串向容器添加两次字符串。

当你遇到'(',你输入字符串到容器,并重置'leftBraceFound'标志。

在此之后,您会在重置标志时遇到',',因此您输入'if'语句块。此时,除了弹出的逗号字符外,堆栈中没有任何内容,然后您创建一个空字符串并将其添加到容器中。

您应该更改“if(array [i] ==',')”块以不添加新字符串,或者如果您预期逗号之间的字符串未包含在括号中,则需要将循环更改为检查逗号并完全忽略括号。