与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