计算用户生成的字符串中的特殊字符

时间:2016-10-03 23:48:48

标签: java string count

所以我有这个程序应该采取任何用户生成的字符串并显示空白,字母,数字和特殊字符的数量。我不想复制一个问题。它似乎有点具体,然后在其他帖子中谈到。

我的错误在于特殊字符。具体的错误是返回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++);
}
}

我哪里出错了,为什么?

4 个答案:

答案 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();

您可以将此技术应用于所有角色类别。