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
答案 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)
的语言的通用算法都是相同的:
您的方法绝对正确,几乎最快!。 (注意:我真的认为两次比较和九次之间的速度非常小,我们不应该关心它)你所能做的只是用它来写减少代码行数。您可以进行以下更正:
char
在JVM中是整数,0-9
的ASCII代码是0x30-0x39
,因此您可以从==
移至ch >= '0' && ch <= '9'
。Character.isDigit(ch)
。Streams
代替手动for...each
。不使用流(普通的旧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)
直接与内部数组一起工作。但我没有遇到任何实际应用方法的问题。