Java isLetterOrDigit () метод, isDigit (), isLetter () - PullRequest
6 голосов
/ 04 декабря 2011

Я пытаюсь выяснить, как проверить String, чтобы проверить, было ли в нем хотя бы одна буква и одно число. Я буду искренен, что это домашнее задание, и я немного запутался.

Существует метод isLetterOrDigit(), который кажется правильным, но я не уверен, как бы реализовать это в своем коде. Вот код, который я использую ниже:

import javax.swing.JOptionPane;

public class Password
{
    public static void main(String[] args)
    {

    String initialPassword;
    String secondaryPassword;
    int initialLength;

    initialPassword = JOptionPane.showInputDialog(null, "Enter Your Passowrd.");

    initialLength = initialPassword.length();

    JOptionPane.showMessageDialog(null, "initialLength = " + initialLength);

    while (initialLength < 6 || initialLength > 10)
    {
        initialPassword = JOptionPane.showInputDialog(null, "Your password does not meet the length requirements. It must be at least 6 characters long but no longer than 10.");
        initialLength = initialPassword.length();
    }

    //Needs to contain at least one letter and one digit

    secondaryPassword = JOptionPane.showInputDialog(null, "Please enter your password again to verify.");

    JOptionPane.showMessageDialog(null, "Initial password : " + initialPassword + "\nSecondar Password : " + secondaryPassword);

    while (!secondaryPassword.equals(initialPassword))
    {
        secondaryPassword = JOptionPane.showInputDialog(null, "Your passwords do not match. Please enter you password again."); 
    }

    JOptionPane.showMessageDialog(null, "The program has successfully completed."); 

    }
}

Я хочу реализовать метод, в котором в разделе комментариев используются методы isDigit(), isLetter() или isLetterOrDigit(), но я просто не знаю, как это сделать.

Любое руководство будет оценено. Заранее благодарим за помощь.

Ответы [ 4 ]

6 голосов
/ 04 декабря 2011

Это должно работать.

public boolean containsBothNumbersAndLetters(String password) {
  boolean digitFound = false;
  boolean letterFound = false;
  for (char ch : password.toCharArray()) {
    if (Character.isDigit(ch)) {
      digitFound = true;
    }
    if (Character.isLetter(ch)) {
      letterFound = true;
    }
    if (digitFound && letterFound) {
      // as soon as we got both a digit and a letter return true
      return true;
    }
  }
  // if not true after passing through the entire string, return false
  return false;
}
0 голосов
/ 11 мая 2016

Кажется, это старый вопрос, и на него уже был дан ответ, но я добавляю свой код, так как столкнулся с проблемой с символами тайского акцентирования. Поэтому я работал над решением этой проблемы и нашел вышеупомянутое решение, которое было неполным, если вы имеете дело с такими персонажами - ก่อน ที่สุด ท้าย o

Для правильной идентификации этих символов вот код:

String value = "abc123ก่อนที่สุด ท้ายo";
    // Loop through characters in this String.
    for (int i = 0; i < value.length(); i++) {
        char c = value.charAt(i);

        // See if the character is a letter or not.
        if (Character.isLetter(c)) {
        System.out.println("This " + c + " = LETTER");
        } 
        if (Character.isDigit(c)) {
        System.out.println("This " + c + " DIGIT");
        }

        if ((""+c).matches("\\p{M}"))
            System.out.println("This " + c + " = UNICODE LETTER");
    }

Не уверен, что кто-то тоже сталкивался с этим. Надеюсь, это поможет.

0 голосов
/ 04 декабря 2011

Код ниже является окончательным кодом, который я придумал благодаря вашим предложениям:

import java.util.Scanner;

public class Password
{
    public static void main(String[] args)
    {

    String initialPassword;
    String secondaryPassword;
    int numLetterCheck = 0;
    int initialLength;
    boolean digitFound = false; boolean letterFound = false;


    Scanner keyboard = new Scanner(System.in);
    System.out.println("Enter a new password: ");
    initialPassword = keyboard.nextLine();

    initialLength = initialPassword.length();

    System.out.println("Your initial password length is: " + initialLength);


    while (initialLength < 6 || initialLength > 10)
    {
        System.out.println("Your password does not meet the length requirements of >6 and <10. Please enter a new password.");
        initialPassword = keyboard.nextLine();
        initialLength = initialPassword.length();
    }

    for (char ch : initialPassword.toCharArray())
    {
        if (Character.isDigit(ch))
        {
            digitFound = true;
        }
        if (Character.isLetter(ch))
        {
            letterFound = true;
        }

        if (digitFound && letterFound)
        {
            numLetterCheck = 0;
        }
        else
        {
            numLetterCheck = 1;
        }
    } 

    while (numLetterCheck == 1)
    {
        System.out.println("Your password must contain at least one number and one number. Please enter a new passord that meets this criteria: ");
        initialPassword = keyboard.nextLine();

        for (char ch : initialPassword.toCharArray())
        {
            if (Character.isDigit(ch))
            {
                digitFound = true;
            }
            if (Character.isLetter(ch))
            {
                letterFound = true;
            }

            if (digitFound && letterFound)
            {
                numLetterCheck = 0;
            }
            else
            {
                numLetterCheck = 1;
            }
        }
    }

    System.out.println("Please enter your password again to verify it's accuracy; ");
    secondaryPassword = keyboard.nextLine();

    System.out.println("Initial password : " + initialPassword + "\nSecondar Password : " + secondaryPassword);

   while (!secondaryPassword.equals(initialPassword))
{
    System.out.println("Your passwords do not match. Please enter your password again to verify.");
    secondaryPassword = keyboard.nextLine();    
}

System.out.println("The program has successfully completed.");  

}

}

0 голосов
/ 04 декабря 2011

Трудно помочь вам сделать это, не предоставив вам весь код для этого, так как он очень короткий.

В любом случае для начала, поскольку вам нужна хотя бы одна буква и хотя бы одна цифра, вам понадобятся два флага, два booleans, которые изначально будут false.Вы можете перебирать каждую char в ininitialPassword, используя цикл foreach:

for (char c : initialPassword.toCharArray())

И затем все, что вам нужно сделать, это проверить на каждой итерации, является ли c буквойцифра и установите соответствующий флаг, если так.После завершения цикла, если установлены оба флага, ваш пароль действителен.Вот как может выглядеть ваш код:

boolean bHasLetter = false, bHasDigit = false;
for (char c : initialPassword.toCharArray()) {
   if (Character.isLetter(c))
      bHasLetter = true;
   else if (Character.isDigit(c))
      bHasDigit = true;

   if (bHasLetter && bHasDigit) break; // no point continuing if both found
}

if (bHasLetter && bHasDigit) { /* valid */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...