查找连续字符串中的两个字符是否为数字的程序在 java 中不起作用
program to find if two characters in String in a row are digits does not work in java
我有下面的代码,我想从键盘获取输入并显示输入是否连续包含 2 个数字。如果是这样,我想在控制台中打印出 false
,否则 true
。它工作正常,除非输入的前 2 个字符是数字。在那种情况下,我仍然会在控制台中得到 true
。谁能明白为什么?提前致谢
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System. in );
System.out.println("Enter:");
String s = sc.nextLine();
if (checkDigit(s)) {
System.out.println("false");
} else {
System.out.println("true");
}
}
public static boolean checkDigit(String s) {
boolean b = true;
char[] c = s.toCharArray();
for (int i = 0; i < c.length - 1; i++) {
if (Character.isDigit(c[i]) && Character.isDigit(c[i + 1])) {
b = true;
} else {
b = false;
}
}
return b;
}
}
即使您已经找到结果,您仍继续检查输入字符串。如 @Stultuske 所述,您覆盖了变量 b
的值,因此您的代码将仅 return true
,如果 last 两个字符是数字。
如果连续有两个数字,您需要从循环中 return:
public static boolean checkDigit(String s) {
char[] c = s.toCharArray();
for(int i=0; i < c.length-1; i++) {
if(Character.isDigit(c[i]) && Character.isDigit(c[i+1])) {
return true;
}
}
return false;
}
UPDATE:事实上,代码片段中存在错误,因为它 return 从循环开始太早了。现已修复。
问题在于您在每次循环迭代时都会覆盖该值,因此只有在最后一对字符匹配时才会为真。但是 .
使用流的替代实现(因为现在所有的孩子都想使用流):
return IntStream.range(0, str.length()-1)
.anyMatch(i -> Character.isDigit(str.charAt(i)) && Character.isDigit(str.charAt(i+1)));
在 if 条件和 return 中使用 Character.isDigit(char) 方法true; 而不是存储 b=true,因为它可能会在下一次迭代中被覆盖。
你也可以使用正则表达式。字符串的 matches(pattern) 方法用于此目的。
尝试使用以下正则表达式
Pattern pattern = Pattern.compile("[0-9]{2}");
Matcher matcher = pattern.matcher("your input string");
我有下面的代码,我想从键盘获取输入并显示输入是否连续包含 2 个数字。如果是这样,我想在控制台中打印出 false
,否则 true
。它工作正常,除非输入的前 2 个字符是数字。在那种情况下,我仍然会在控制台中得到 true
。谁能明白为什么?提前致谢
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System. in );
System.out.println("Enter:");
String s = sc.nextLine();
if (checkDigit(s)) {
System.out.println("false");
} else {
System.out.println("true");
}
}
public static boolean checkDigit(String s) {
boolean b = true;
char[] c = s.toCharArray();
for (int i = 0; i < c.length - 1; i++) {
if (Character.isDigit(c[i]) && Character.isDigit(c[i + 1])) {
b = true;
} else {
b = false;
}
}
return b;
}
}
即使您已经找到结果,您仍继续检查输入字符串。如 @Stultuske 所述,您覆盖了变量 b
的值,因此您的代码将仅 return true
,如果 last 两个字符是数字。
如果连续有两个数字,您需要从循环中 return:
public static boolean checkDigit(String s) {
char[] c = s.toCharArray();
for(int i=0; i < c.length-1; i++) {
if(Character.isDigit(c[i]) && Character.isDigit(c[i+1])) {
return true;
}
}
return false;
}
UPDATE:事实上,代码片段中存在错误,因为它 return 从循环开始太早了。现已修复。
问题在于您在每次循环迭代时都会覆盖该值,因此只有在最后一对字符匹配时才会为真。但是
使用流的替代实现(因为现在所有的孩子都想使用流):
return IntStream.range(0, str.length()-1)
.anyMatch(i -> Character.isDigit(str.charAt(i)) && Character.isDigit(str.charAt(i+1)));
在 if 条件和 return 中使用 Character.isDigit(char) 方法true; 而不是存储 b=true,因为它可能会在下一次迭代中被覆盖。
你也可以使用正则表达式。字符串的 matches(pattern) 方法用于此目的。
尝试使用以下正则表达式
Pattern pattern = Pattern.compile("[0-9]{2}");
Matcher matcher = pattern.matcher("your input string");