2012-07-06 50 views
0

你好,我正試圖修復我的代碼中的一個錯誤。當讀取傳入的短語時,此代碼似乎不計算整數。它計算非整數字的數量沒有問題。 例如,如果我有以下句子: 「我愛我的4只貓」 它應該顯示我有4個非整數字和1個整數。但整數並非如此,它似乎將其識別爲一個詞 任何想法?Java:識別字符串中的Ints和非Ints

String[] stra = phrase.split(" ");  
     int numInts = 0;  
     int numNonInts = 0;  
     for (String s : stra) {  
      try {  
       Integer.parseInt(s);  
      }  
      catch(NumberFormatException nfe) {  
       numNonInts++;  
       continue;  
      }  
      numInts++;  
     }  
+3

此代碼的工作在我的系統就好了;它標記爲四個單詞和一個非單詞。你確定這個代碼是問題嗎? – templatetypedef 2012-07-06 20:54:13

回答

0

嘗試使用:的

Integer.valueOf(s); 

代替

Integer.parseInt(s); 
+1

爲什麼這會有幫助?這將如何解決這個問題? – templatetypedef 2012-07-06 20:56:41

+2

看不到這會有什麼幫助,因爲Integer.valueOf()只是在內部調用Integer.parseInt()。如果我沒有弄錯唯一的區別是返回類型(int vs Integer) – Andrew 2012-07-06 20:57:59

2
 String[] stra = phrase.split("\\W+"); // + for sequences 
    int numInts = 0;  
    int numNonInts = 0;  
    for (String s : stra) {  
     try {  
      Integer.parseInt(s);  
      numInts++;  
     }  
     catch (NumberFormatException nfe) {  
      numNonInts++;  
     }  
    }  

兩個空格會算作一個字。 另外\\W包括所有非字詞字符。

+0

你能解釋爲什麼這比OP的原始代碼更好嗎? – templatetypedef 2012-07-06 20:57:17

+0

@JB Nizet - OP的代碼在每次迭代時不會增加numInts; '繼續'將跳回到頂部,而不是在'catch'之後繼續。這很複雜,但它有效(我已經在我的系統上驗證過) – templatetypedef 2012-07-06 20:59:58

+0

是的,對不起。我錯過了繼續。我討厭繼續。 – 2012-07-06 21:00:28

0

爲了避免意外的分隔符(如製表符,空格兩倍或換行符),代替你的分裂:

phrase.split("\\s+"); 

也許你得到了超過Integer數量上限。

更換您的循環:

for (String s : stra) { 
    if(s.matches("\\d+")) 
     numInts++;  
    else    
     numNonInts++;  
}