Java:识别字符串中的Ints和非Ints

问题描述:

你好,我正试图修复我的代码中的一个错误。当读取传入的短语时,此代码似乎不计算整数。它计算非整数字的数量没有问题。 例如,如果我有以下句子: “我爱我的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

尝试使用:的

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

 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

为了避免意外的分隔符(如制表符,空格两倍或换行符),代替你的分裂:

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

也许你得到了超过Integer数量上限。

更换您的循环:

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