2014-02-16 1389 views
0

我正在写一个小计算器应用程序,并使用一个简单的标记器来解析用户输入到列表中进行后续处理。与Stringbuilder的神秘空白

的方法是这样的:

public LinkedList<String> tokenize(String infix) throws Exception 
{ 
    LinkedList<String> tokens = new LinkedList<String>(); 
    StringBuilder operand = new StringBuilder(""); 

    char current; 

    int index = 0; 
    while(index <= infix.length() -1) { 
     current = infix.charAt(index); 

     if(!isOperator(current)) { 
      operand.append(current); 
     } else { 
      // Add the operand stack 
      tokens.add(operand.toString()); 
      operand = new StringBuilder(""); 
      // Add the operator 
      tokens.add(Character.toString(current)); 
     } 
     index++; 
    } 
    // The trailing operator 
    tokens.add(operand.toString()); 
    return tokens; 
} 

我已经设置了这种方法的测试,看起来是这样的:

public void testTokenizer() throws Exception 
{ 
    LinkedList<String> list = parser.tokenize("35+35"); 
    assertTrue(list.get(0) == "35" && 
     list.get(1) == "+" && 
     list.get(2) == "35"); 
} 

然而,失败的原因是分词似乎添加空格到令牌。例如,打印从字符串“35 + 35”标记的列表给我:

[35, +, 35] 

这是怎么回事?

+1

另外请注意,字符串比较是错误的,您不能使用'=='来测试相等性,请使用'equals()'。例如:''35“.equals(list.get(0))' –

回答

2

这是由于在调用List#toString期间如何创建List的字符串表示形式所导致的。这基本上实现

firstElement + ", " + secondElement + ", " + .... 

所以这些空格不是在元素,但只有在列表本身的字符串表示。

编辑:您也可以通过打印类似

System.out.println(">"+list.get(1)+"<"); 

验证这一点这将打印

>+< 

,而不是

> +< 
0

标记生成器不增加空间的令牌。这是最有可能由LinkedList's toString()方法来完成,当你显示列表:

字符串表示形式的顺序集合的元素列表它们是由它的迭代器返回,方括号括起来的("[]") 。相邻元素由字符", "(逗号和空格)分隔。

断言不起作用,因为它使用==。例如,list.get(0) == "35"应该是list.get(0).equals("35")。这些是运行时String对象而不是编译时间常量,所以==不会用于比较。

+0

该死的。我应该抓住那个!谢谢。 –

0

您的测试失败,因为它不正确地比较字符串。

如果您更改它以使用.equals方法,您应该这样做,此测试通过。

@Test 
public void testTokenizer() throws Exception 
{ 
    LinkedList<String> list = parser.tokenize("35+35"); 
    assertTrue(list.get(0).equals("35") 
      && list.get(1).equals("+") 
      && list.get(2).equals("35")); 
} 

标记未添加空格。