2014-02-16 339 views
0

我正在寫一個小計算器應用程序,並使用一個簡單的標記器來解析用戶輸入到列表中進行後續處理。與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] 

這是怎麼回事?

+1

另外請注意,字符串比較是錯誤的,您不能使用'=='來測試相等性,請使用'equals()'。例如:''35「.equals(list.get(0))' –

回答

2

這是由於在調用List#toString期間如何創建List的字符串表示形式所導致的。這基本上實現

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

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

編輯:您也可以通過打印類似

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

驗證這一點這將打印

>+< 

,而不是

> +< 
0

標記生成器不增加空間的令牌。這是最有可能由LinkedList's toString()方法來完成,當你顯示列表:

字符串表示形式的順序集合的元素列表它們是由它的迭代器返回,方括號括起來的("[]") 。相鄰元素由字符", "(逗號和空格)分隔。

斷言不起作用,因爲它使用==。例如,list.get(0) == "35"應該是list.get(0).equals("35")。這些是運行時String對象而不是編譯時間常量,所以==不會用於比較。

+0

該死的。我應該抓住那個!謝謝。 –

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

標記未添加空格。