所以我有这个程序应该采取任何用户生成的字符串并显示空白,字母,数字和特殊字符的数量。我不想复制一个问题。它似乎有点具体,然后在其他帖子中谈到。
我的错误在于特殊字符。具体的错误是返回0.我在他们就此事进行的每次讨论中都引用了堆栈溢出。这帮助我形成了特殊的角色方法。
我必须明确主要方法并调用上述方法
public static void main(String[] args) {
Scanner kbd = new Scanner(System.in);
String userInput;
System.out.println("Please enter a string");
userInput = kbd.nextLine();
countletter(userInput);
countnumber(userInput);
countspecial(userInput);
countSpace(userInput);
}
public static void countletter(String userInput) {
int countletter = 0;
for (int i = 0; i < (userInput.length() - 1); i++) {
char location = userInput.charAt(i);
boolean x = Character.isLetter(location);
if (x) {
countletter++;
}
}
System.out.println("The number of Letters is: " + countletter);
}
public static void countnumber(String userInput) {
int countnumber = 0;
for (int i = 0; i < userInput.length() - 1; i++) {
char location = userInput.charAt(i);
boolean x = Character.isDigit(location);
if (x) {
countnumber++;
}
}
System.out.println("The number of digits is: " + countnumber);
}
public static void countSpace(String userInput) {
int countSpace = 0;
for (int i = 0; i < userInput.length() - 1; i++) {
char location = userInput.charAt(i);
boolean x = Character.isWhitespace(location);
if (x) {
countSpace++;
}
}
System.out.println("The number of white spaces is: " + countSpace);
}
public static void countspecial(String userInput) {
if (userInput == null || userInput.trim().isEmpty()) {
return 0;
}
int countSpecial = 0;
for (int i = 0; i < userInput.length(); i++) {
if (userInput.substring(i, 1).matches("[^A-Za-z0-9 ]")) {
countSpecial++;
}
}
System.out.println("The number of special chars is: " + countSpecial++);
}
}
我最初尝试countSpecial:
public static void countspecial(String userInput) {
int countSpecial = 0;
for (int i = 0; i < (userInput.length() - 1); i++) {
if (userInput.substring(i, 1).matches("[^A-Za-z0-9]")) {
countSpecial++;
}
}
System.out.println("The number of special chars is: " + countSpecial++);
}
}
我哪里出错了,为什么?
答案 0 :(得分:0)
在您的初始尝试中,您的子字符串存在问题 substring第二个参数将是子字符串+1中最后一个字符的索引,因此您需要迭代直到userInput.length()而不是userInput.length() - 1。 而且我不知道为什么你会在打印之后递增计数,它实际上什么也没做,但仍然毫无意义。
public static void countspecial(String userInput) {
if (userInput == null || userInput.trim().isEmpty()) {
return ;
}
int countSpecial = 0;
for (int i = 0; i < userInput.length(); i++) {
if (userInput.substring(i, i+1).matches("[^A-Za-z0-9]")) {
countSpecial++;
}
}
System.out.println("The number of special chars is: " + countSpecial);
}
一种更好的方法,而不是子串,你可以使用&#34;(userInput.charAt(i)+&#34;&#34;)。匹配&#34;。
但更好的解决方案是计算所有的数字和字母,并从字符串的总长度中减去它们的总和,这将为您提供特殊字符的数量,因为不建议使用正则表达式来满足这样的简单要求。
答案 1 :(得分:0)
查看子字符串的javadocs。
一些使用substring(int beginIndex,int length)的语言,其中beginIndex是你开始子字符串的地方, length 是子字符串中有多少个字符。
Java使用substring(int beginIndex,int endIndex),其中beginIndex是您开始子字符串的地方,endIndex是结束字符的位置。
userInput.substring(i, 1);
其中i = 2表示你想在索引位置2开始子串并在索引位置1结束它,并抛出异常。
答案 2 :(得分:0)
如果您要定义除字母,数字或空白字符以外的任何字符,那么&#34;特殊&#34;那么你应该以与其他测试相同的方式对它进行测试,这样你就不会错过任何东西,因为对字母或数字的构成有不同的定义。对于任何Unicode字母,Character.isLetter()都将返回true,例如,不仅仅是ASCII A-Z或a-z。为了保持一致性,您应该写:
AlertDialog
但原始代码中的问题是String.substring()的第二个参数是&#39; to&#39;索引,而不是长度。所以,如果你要使用正则表达式,它应该是
char c = userInput.charAt(i);
if (!Character.isDigit(c) && !Character.isLetter(c) && !Character.isWhiteSpace(c)) {
countSpecial++;
}
这是一个实际的例子,还是你在寻求帮助? : - )
答案 3 :(得分:-1)
更简单,不要循环。只需用无任何替换所有非特殊字符并计算长度:
int countSpecial = userInput.replaceAll("[A-Za-z0-9\\s]", "").length();
您可以将此技术应用于所有角色类别。