Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Stringbuilder的神秘空白_Java_String_Stringbuilder - Fatal编程技术网

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"));
}