我无法弄清楚如何使用单isValidPassword
方法解决此问题,因此我将其分解为3并使其正常工作。有人可以向我解释我如何使用我编写的代码并且可能会压缩它吗?
创建程序密码,提示用户输入密码并确定密码是有效还是无效。应该有一个静态方法isValidPassword
验证密码(String)并返回true或false。用户只有三次尝试输入有效密码。
有效密码遵循以下三条规则:
- Must have at least eight characters.
- Must contain ONLY letters and digits.
- Must contain at least two digits.
使用程序的对话框。您必须为此程序使用String和Character类。您不能使用正则表达式。该程序只需运行一次。
import javax.swing.JOptionPane;
public class Password {
public static void main(String[] args) {
int retryCount = 0;
while (retryCount < 3) {
retryCount++;
String password = JOptionPane.showInputDialog("Please Enter the Password");
if (CheckPassword(password)) {
JOptionPane.showMessageDialog(null, "Congrats! Correct Password!");
break;
}
else {
JOptionPane.showMessageDialog(null, "Sorry, Invalid Password, you tried " + retryCount + " times");
continue;
}
}
}
public static boolean CheckPassword(String password) {
if (password.length() >= 8 & CheckAlphanumeric(password) && Check2digits(password)) {
return true;
}
else {
return false;
}
}
public static boolean CheckAlphanumeric(String string) {
for (int i = 0; i < string.length(); i++) {
char x = string.charAt(i);
if (x < 0x30 || (x >= 0x3a && x <= 0x40) || (x > 0x5a && x <= 0x60) || x > 0x7a) {
return false;
}
}
return true;
}
public static boolean Check2digits(String string) {
int count = 0;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (Character.isDigit(c)) {
count++;
}
if (count > 2) {
return true;
}
}
return false;
}
}
答案 0 :(得分:2)
让我们快速回顾一下代码:
isPasswordValid()
,例如除此之外;建议如何改善现实世界的设计&#34;用法。事情是:可以有许多不同的规则使密码有效。哪个可能随着时间而改变。通常,您会想要告诉您的用户他的输入与哪些规则相冲突。解决这些问题的一个选择是:
public interface PasswordValidator {
public void checkPassword(String password) throws InvalidPasswordException;
}
然后您创建各种实现,例如
public class MinimumLengthValidator implements PasswordValidator {
@Override
public void checkPassword(String password) throws InvalidPasswordException {
if (password.lenght() < 8) {
throw new InvalidPasswordException("Given password is not long enough; expecting at least 8 characters");
}
}
然后,您创建那些不同验证器类的实例;并将它们存储在某个数组中。您迭代数组,并自己调用每个验证;当它失败时,你会直接收到一个异常,并为用户提供一条好消息。
如上所述:以上仅仅是灵感(只需输入,所以要小心拼写错误)。
答案 1 :(得分:0)
请查看以下可能满足您所有要求的代码 -
这是纯java类。你可以从下面的代码中查看逻辑。
program edit1 - 指定密码错误的原因。
public class Demo {
private final int passwordAttempts = 3;
private int countAttempts = 0;
private String password;
private int digitCounter = 0;
public Demo() {
init();
}
public static void main(String[] args) {
new Demo();
}
private String checkPassword(String pass) {
if (pass.length() >= 8) {
if (StringUtils.isAlphanumeric(pass)) {
char[] toCharArray = pass.toCharArray();
for (int i = 0; i < toCharArray.length; i++) {
char check = toCharArray[i];
if(Character.isDigit(check)){
digitCounter++;
}
}
if (digitCounter >= 1) {
return "success";
}else{
return "digit";
}
}else{
return "alphanumeric";
}
}else{
return "length";
}
}
private void init() {
while (countAttempts < passwordAttempts) {
password = JOptionPane.showInputDialog("Please Enter the Password");
digitCounter = 0;
String passwordResult = checkPassword(password);
if (passwordResult.equals("success")) {
JOptionPane.showInputDialog("yes you entered correct password...");
} else if(passwordResult.equals("length")){
JOptionPane.showInputDialog("password must contain atleast 8 characters...");
}else if(passwordResult.equals("alphanumeric")){
JOptionPane.showInputDialog("only alphanumeric password accept...");
}else if(passwordResult.equals("digit")){
JOptionPane.showInputDialog("password must contain atleast two digits...");
}
countAttempts++;
}
}
}
现在只需要将JOptionPane.showInputDialog()方法替换为仅指定消息的其他方法,因为showInputDialog()方法也提示输入文本字段也输入值,我们不希望这样。我不知道任何关于挥杆的想法。
根据您的评论
此方法返回字符串值,如success,length,alphanumeric,digit ect。以下我们将这些值与上面的所有值进行比较if if else if。只要它相等,就意味着我们必须相应地显示长度消息,字母数字字符串消息,数字消息。
依赖关系 -
我正在使用maven。以下依赖项需要添加到pom.xml文件中。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
如果你不了解maven,那么只需从here下载jar文件并提供你项目的lib文件夹。