2012-01-10 116 views
1

我想在我的字符串的某些部分插入空格。 我正在寫一個計算器計算器。插入字符串的某些部分

例如,對於字符串

"23+45"我希望它是"23 + 45"

"1+(4*8)" as "1 + (4 * 8)"

我這樣做,這樣我可以根據空間分割字符串,

我使用的調度場算法,所以我需要tokenise輸入。

+0

你的問題是....和你的代碼,這嘗試這看起來像....但它確實....而不是你所期望的是.... ??? – 2012-01-10 10:13:58

+0

現在我在輸入本身中插入空格。所以我還沒有真正的代碼。我已經編寫了程序的其餘部分,但那不是真的與此有關。 – saviok 2012-01-10 10:16:38

回答

6

很簡單。

"23+45".replaceAll("[+*()]", " $0 ").trim(); 

trim()修剪任何尾隨空格。

您可以包括其他運營商像這樣:

"23+(45*-30/2)".replaceAll("[+*()-/]", " $0 ").trim(); 
+0

+1。你忘了'-'(減號)和'/'(除)。 – 2012-01-10 10:19:24

+0

這可能會導致字符串中出現多個空格,可以使用另一個'replaceAll'來代替修剪來修剪其他空格:''23 + 45「.replaceAll(」[ -/+ *()]「,」 $ 0「).replaceAll(」\\ s +「,」「);' – fivedigit 2012-01-10 10:21:51

+0

@HarryJoy更新了我的答案,謝謝。但我認爲''不應該被空格隔開,如果用作符號的話。用它作爲操作符,空間很好。哪個更好看? '2 * -4'或'2 * - 4'? – adarshr 2012-01-10 10:22:49

0

的想法添加,因爲分裂字符串目的,比你還可以通過拆分算術運算符也用Class StringTokenizer字符串的空間。 更多關於StringTokenizer

+0

在現代Java中我沒有看到使用'StringTokenizer'的任何一點。 – adarshr 2012-01-10 10:29:56

+0

這是一個你可以嘗試的例子: String msg =「1+(4 * 8)」; StringTokenizer st = new StringTokenizer(msg,「+ */- 」); (st.hasMoreTokens()){System.out.println(st。的nextToken()); – 2012-01-10 10:37:08

+0

這就是我想說的。你必須寫4行,它仍然不給我最後的字符串。要做到這一點,你必須添加另外3行來使用'StringBuilder'。 – adarshr 2012-01-10 10:44:31

0

SavK,

插入令牌,然後再分析它們似乎是多餘的無用操作。 (上面的無反義,正則表達式解決方案只是簡短而且很好(我的+1))或者,您可以直接向Shunting Yard算法(需要令牌作爲輸入)提供令牌。

嘗試查看StreamTokenizer類(從JDK 1.0開始)解析令牌的表達式。它所做的所有分析都需要將令牌返回給您(甚至更多:將數字作爲整數數字令牌)。

這是原始演示。

package core; 

import java.io.IOException; 
import java.io.StreamTokenizer; 
import java.io.StringReader; 

public class Q { 
public static void main(String[] args) { 
    StreamTokenizer stok = new StreamTokenizer(new StringReader("1+(40*8)")); 
    stok.parseNumbers(); 
    try { 
     while(stok.nextToken() != StreamTokenizer.TT_EOF) { 
      System.out.println("nval: "+stok.nval); 
      System.out.println("sval: "+stok.sval); 
      System.out.println("ttype: "+stok.ttype); 
      System.out.println("toString: "+stok.toString()); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 
相關問題