为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复java中while循环的条件

如何修复java中while循环的条件

守着星空守着你 2023-08-04 15:28:42
我的代码很简单;检查字符串中有多少数字、小写字母、大写字母和特殊字符,但每种字符必须至少有一个;我认为 while 循环中条件的 AND 或 OR 有问题public static void main(String[] args) {        Scanner scn = new Scanner(System.in);        String name = scn.nextLine();        checkPass(name);}public  static void checkPass (String str){    int toul = str.length();    int normalLower=0;    int normalUpper=0;    int number=0;    int special=0;    while(normalLower==0 || normalUpper==0 || number==0 || special==0) {        for (int i = 0; i < toul; i++) {            String s = String.valueOf(str.charAt(i));            if (s.matches("^[a-z]*$")) {                normalLower++;            } else if (s.matches("^[A-Z]*$")) {                normalUpper++;            } else if (s.matches("^[0-9]*$")) {                number++;            } else {                special++;            }        }    }    System.out.println("normalupper " + normalUpper);    System.out.println("normallower " + normalLower );    System.out.println("number" + number);    System.out.println("special " + special);}我希望每当缺少 char 类型时它都会要求提供字符串,但事实并非如此
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

boolean尝试从方法返回状态checkPass并在方法中放置一个 while 循环main,状态将是您正在检查的条件。


这样,如果输入的字符串通过验证,您可以中断 while 循环,否则循环将继续要求有效输入String:


public static void main(String[] args) throws Exception {

        Scanner scn = new Scanner(System.in);

        String name = scn.nextLine();

        while(checkPass(name)){

            name = scn.nextLine();

        }

    }


 // If the boolean retuned from this method is false it will break the while loop in main

 public static boolean checkPass(String str) {

     int toul = str.length();

     int normalLower = 0;

     int normalUpper = 0;

     int number = 0;

     int special = 0;

     for (int i = 0; i < toul; i++) {

         String s = String.valueOf(str.charAt(i));

         if (s.matches("^[a-z]*$")) {

             normalLower++;

         } else if (s.matches("^[A-Z]*$")) {

             normalUpper++;

         } else if (s.matches("^[0-9]*$")) {

             number++;

         } else {

             special++;

         }

      }

      System.out.println("normalupper " + normalUpper);

      System.out.println("normallower " + normalLower);

      System.out.println("number" + number);

      System.out.println("special " + special);

      return normalLower == 0 || normalUpper == 0 || number == 0 || special == 0;

 }


查看完整回答
反对 回复 2023-08-04
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我建议使用Character类来检查我们正在处理的字符类型:


public static boolean checkPass(String str) {

    int normalLower=0;

    int normalUpper=0;

    int number=0;

    int special=0;

    for (char c : str.toCharArray()) {

        if (Character.isDigit(c)) {

            number++;

        } else if (Character.isUpperCase(c)) {

            normalUpper++;

        } else if (Character.isLowerCase(c)) {

            normalLower++;

        } else {

            special++;

        }

    }

    System.out.println("normalupper " + normalUpper);

    System.out.println("normallower " + normalLower);

    System.out.println("number" + number);

    System.out.println("special " + special);

    return normalLower == 0 || normalUpper == 0 || number == 0 || special == 0;

}


查看完整回答
反对 回复 2023-08-04
?
呼如林

TA贡献1798条经验 获得超3个赞

这是使用 Java 8 Streams 和 lambda 函数来获取计数的版本:


public static String getType(int code){

    if(Character.isDigit(code)) return "number";

    if(Character.isLowerCase(code)) return "normalLower";

    if(Character.isUpperCase(code)) return "normalupper";

    return "special";

}


public static void checkPass(String s){

    Map map =s.chars().mapToObj(x->getType(x))

            .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

    System.out.println(map);

}

示例运行:


checkPass("密码"); 输出==> {正常上=2,正常下=6}


checkPass("P@ss@Wo1r d3"); 输出==> {特殊=3,数字=2,正常上=2,正常下=5}


查看完整回答
反对 回复 2023-08-04
  • 3 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信