与Stringbuilder的神秘空白

我正在写一个小计算器应用程序,并使用一个简单的标记器来解析用户输入到列表中进行后续处理。与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] 

这是怎么回事?

回答:

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

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

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

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

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

验证这一点这将打印

>+< 

,而不是

> +< 

回答:

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

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

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

回答:

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

如果您更改它以使用.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"));

}

标记未添加空格。

以上是 与Stringbuilder的神秘空白 的全部内容, 来源链接: utcz.com/qa/267380.html

回到顶部