与Stringbuilder的神秘空白

时间:2014-02-16 15:52:03

标签: java string 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");
}

但是,这会失败,因为tokenizer似乎会向标记添加空格。例如,打印从字符串“35 + 35”标记的列表给我:

[35, +, 35]

这里发生了什么?

3 个答案:

答案 0 :(得分:2)

这是由于在调用List期间如何创建List#toString的字符串表示的方式引起的。这基本上实现为

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

所以这些空格不在元素中,而只在List本身的String表示中。

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

来验证这一点
System.out.println(">"+list.get(1)+"<");

这将打印

>+<

而不是

> +<

答案 1 :(得分:0)

标记器不会为标记添加空间。当您显示列表时,最有可能通过LinkedList's toString()方法完成:

  

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

断言不起作用,因为它使用==。例如,list.get(0) == "35"应为list.get(0).equals("35")。这些是运行时字符串对象而不是编译时间常量,因此您不希望进行比较==

答案 2 :(得分: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"));
}

标记器不添加空格。