是否有更好的方法来检查其中任何数字的字符串?

时间:2017-09-23 20:50:43

标签: java string numbers counter

基本上,我已经被要求编写一个程序来检查字符串中数字的显示次数并将其打印出来。这就是我所拥有的

    BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
    System.out.println("Please enter your string");
    String s = input.readLine();
    /*System.out.println("Please enter the chracter you are looking for");
    char c = (char)input.read();*/
    char one = '1';
    char two = '2';
    char three = '3';
    char four = '4';
    char five = '5';
    char six = '6';
    char seven = '7';
    char eight = '8';
    char nine = '9';
    char zero= '0';
int counter = 0;
for( int i=0; i<s.length(); i++ ) {
    if( s.charAt(i) == one || s.charAt(i) == two || s.charAt(i) == three || s.charAt(i) == four || 
 s.charAt(i) == five || s.charAt(i) == six || s.charAt(i) == seven 
 || s.charAt(i) == eight || s.charAt(i) == nine || s.charAt(i) == zero ) {
        counter++;


    } 


}

有更快,更好的方法吗?我尝试了另一种方法但是这个错误

Error: The operator || is undefined for the argument type(s) boolean, char

4 个答案:

答案 0 :(得分:0)

您可以在Java中查看Character.isDigit()方法,而不是在代码中自己声明数字。这将使代码更清晰。没有其他更快的方法可以做到这一点。

如果要计算每个数字的出现次数,一种简单的方法就是使用Java Maps。您可以从here阅读有关地图的基本教程。

答案 1 :(得分:0)

这适用于c#

foreach (char c in str)
    {
        if (c >= '0' && c <= '9')
            counter++;
    }

答案 2 :(得分:0)

您可以使用字符的十进制值(如ASCII table中所定义)

String s = "abc123def456";
int cpt = 0;
for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
        cpt++;
    }
}
System.out.println(cpt); // 6

您还可以使用Character::isDigit方法

if (Character.isDigit(s.charAt(i))) {
    cpt++;
}

编辑:

如果您使用的是Java 8+,则可以在字符串中转换字符串,应用过滤器来保留数字,然后计算其中的元素数。

long nbDigits = s.chars()
    .filter(Character::isDigit) // If the character is a digit (= the isDigit() method returns true) it's kept in the stream
    .count();
System.out.println(nbDigits); // 6

答案 3 :(得分:0)

  

有更快,更好的方法吗

您的方法绝对正确且几乎最快!你可以让它可读。

我认为所有使用O(n)的语言的通用算法都是相同的:

  1. 在找到数字字符时循环数组并递增计数器。
  2. 您的方法绝对正确,几乎最快!注意:我真的认为两次比较和九次之间的速度非常小,我们不应该关心它)你所能做的只是用它来写减少代码行数。您可以进行以下更正:

    1. char在JVM中是整数,0-9的ASCII代码是0x30-0x39,因此您可以从==移至ch >= '0' && ch <= '9'
    2. 字符类包含检查它的特殊方法:Character.isDigit(ch)
    3. 对于java 8,您可以使用Streams代替手动for...each
    4. 不使用流(普通的旧java) 我认为这种方法可以提供最大速度并提取内存对象

      public int countDigits(String str) {
          int count = 0;
      
          for(int i = 0; i < str.length(); i++)
              if(Character.isDigit(str.charAt(i)))
                  count++;
      
          return count;
      }
      

      使用stream(来自java 8)。看起来不错,比前面的例子慢一点,并在内存中创建了一些额外的对象。

      public int countDigits(String str) {
          // could be a little bit slower, because additional objects are created inside
          return (int)str.chars().filter(Character::isDigit).count();
      }
      

      P.S。 如果您想展示自己的技能,那么普通的旧java变体更为可取。在工作代码中,两个变体都是相同的。

      PPS 实际上String.toCharArray()str.chars()看起来更优雅,甚至更少表现str.charAr(int) ,因为它们在内存中创建了其他对象,但str.charAr(int)直接与内部数组一起工作。但我没有遇到任何实际应用方法的问题