Java 带Stringbuilder的神秘空白
我正在编写一个小型计算器应用程序,并使用一个简单的标记器将用户输入解析为一个列表,以供后续处理 方法如下所示:Java 带Stringbuilder的神秘空白,java,string,stringbuilder,Java,String,Stringbuilder,我正在编写一个小型计算器应用程序,并使用一个简单的标记器将用户输入解析为一个列表,以供后续处理 方法如下所示: public LinkedList<String> tokenize(String infix) throws Exception { LinkedList<String> tokens = new LinkedList<String>(); StringBuilder operand = new 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");
}
这是怎么回事?这是由调用
List#toString
时创建列表
的字符串表示方式造成的。这基本上是按照
firstElement + ", " + secondElement + ", " + ....
因此,这些空白不在元素中,而仅在列表本身的字符串表示中
编辑:您也可以通过打印以下内容来验证这一点
System.out.println(">"+list.get(1)+"<");
System.out.println(“>”+list.get(1)+“标记器没有向标记添加空间。这很可能是在显示列表时通过以下方法完成的:
字符串表示法由集合元素列表组成,这些元素按迭代器返回的顺序排列,用方括号(“[]”“
)括起来。相邻元素之间用字符“”、“
”(逗号和空格)分隔
断言不起作用,因为它使用了=
。例如,列表。get(0)==“35”
应该是列表。get(0)。equals(“35”)
。这些是运行时字符串对象,而不是编译时常量,因此=
不需要进行比较。您的测试失败,因为它比较的字符串不正确
如果您将其更改为使用.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"));
}
@测试
public void testTokenizer()引发异常
{
LinkedList=parser.tokenize(“35+35”);
assertTrue(list.get(0.equals)(“35”)
&&list.get(1).equals(“+”)
&&得到(2)等于(“35”);
}
标记器没有添加空格。还要注意字符串比较是错误的,不能使用=
来测试相等性,请使用equals()
。例如:“35”.equals(list.get(0))
该死。我应该抓到这个!谢谢。
>+<
> +<
@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"));
}