任务要求
编写一个模拟新浪微博用户注册的程序,要求使用HashSet 集合实现。假设当用户输入用户名、密码、确认密码、生日(输入格式为 yyyy-mm-dd 为正确)、手机号码(手机号长度为11位,并且以13、15、17或18为开头的手机号位为正确)、邮箱(包含符号“@”为正确)信息之后,判断信息输入是否正确,正确验证用户是否重复注册,如果不是重复注册则注册成功。例如,用户信息列表中已经存在用户“张正”,当张正再次注册时,则输出“注册结果:用户重复!”。
预期结果
思路
假设当用户输入用户名、密码、确认密码、生日(输入格式为 yyyy-mm-dd 为正确)、手机号码(手机号长度为11位,并且以13、15、17或18为开头的手机号位为正确)、邮箱(包含符号“@”为正确)信息之后,判断信息输入是否正确,正确验证用户是否重复注册,如果不是重复注册则注册成功。例如,用户信息列表中已经存在用户“张正”,当张正再次注册时,则输出“注册结果:用户重复!”。
一:判断生日的格式是否为yyyy-mm-dd
用SimpleDateFormat类型,在创建该实例的时候传入你要的日期格式即可
然后调用该类的parse(your_date)方法判断,是否符合预期
if用户的输入格式错误那么提示重新输入
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class DateValidator {
private static final String DATE_FORMAT = "yyyy-MM-dd";
public static boolean isValidBirthDate(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
try {
// 尝试将字符串转换为日期
sdf.parse(dateStr);
return true; // 如果没有抛出异常,则认为格式正确
} catch (ParseException e) {
return false; // 抛出异常说明格式不正确
}
}
// 使用示例:
public static void main(String[] args) {
String birthDate = "1990-12-31";
boolean isValid = isValidBirthDate(birthDate);
if (isValid) {
System.out.println("输入的日期格式正确");
} else {
System.out.println("输入的日期格式错误");
}
}
}
二:判断手机号长度是否为11位,且要以13、15、16、17、18开头
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class PhoneNumberValidator {
public static boolean isMobileNO(String mobile) {
String regex = "^1[3-9]\\d{9}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(mobile);
return matcher.matches();
}
// 使用示例:
public static void main(String[] args) {
String testNumber = "13800138000";
if (isMobileNO(testNumber)) {
System.out.println("手机号码格式正确");
} else {
System.out.println("手机号码格式错误");
}
}
}
上述代码中,正则表达式"^1[3-9]\\d{9}$"
的含义如下:
^
表示匹配输入字符串的开始。1
表示第一位数字必须是1。[3-9]
表示第二位数字必须在3到9之间。\\d{9}
表示接下来有9位任意数字(在Java中需要使用双反斜杠\
来转义特殊字符,所以写成\\d
)。$
表示匹配输入字符串的结束。
因此,整个正则表达式会匹配11位的手机号码,其中前两位分别是1和3至9之间的任何一个数字。
解释一下上面的几行代码:
Pattern pattern = Pattern.compile(regex);
compile()
方法是 Pattern
类的一个静态方法,它接收一个字符串参数(在这里是 regex
),该字符串包含要匹配的正则表达式规则。这行代码的作用就是将你定义的正则表达式字符串转换为一个Pattern对象。你可以理解为一个正确的模板
1Matcher matcher = pattern.matcher(mobile);
matcher()
是 Pattern
类的一个实例方法,它返回一个新的 Matcher
对象。
这里的 mobile
参数是你想要验证的手机号码。它会验证手机号是否和规则匹配
1return matcher.matches();
最后,调用 Matcher
类的 matches()
方法。如果整个手机号码字符串完全符合我们之前定义的正则表达式规则,那么 matches()
方法会返回 true
,否则返回 false
。
三:邮箱包含@
1public class Main {
2 public static void main(String[] args) {
3 String email = "example@example.com";
4 if (email.contains("@")) {
5 System.out.println("字符串中包含 '@' 符号,可能为邮箱地址");
6 } else {
7 System.out.println("字符串中不包含 '@' 符号");
8 }
9 }
10}
这段代码中的 contains
方法是 String
类的一个实例方法,它会检查该字符串中是否包含指定的字符序列(在这里是 "@" 符号)。如果包含,返回 true
;否则返回 false
。
四:用户信息列表中已经存在用户“张正”,当张正再次注册时,则输出“注册结果:用户重复!”。
将一个String类型用户名存入HashSet,重写equals方法,如果两个元素相同,则输出重复即可。
注意:这个问题害我搞了好久
public boolean equals(Object obj) {//这里传入的obj是指谁?首先这个this是指新元素在被添加时调用了equals方法,那么这个this就是值新元素的新对象
//这样理解对吗?那么当新元素调用了equals方法,他传入的obj是谁呢?难道是所有的老元素吗?
//是的obj就是指所有的老元素。
if (this == obj) {
return true;
}//这里的obj是如何做到代表了上一个对象的?
//别看感叹号,把false改为true就好理解了
if (!(obj instanceof User)) {
return false;
}
User u = (User) obj;//执行这一步的意义?两个的值是一样的对吧,只是类型不一样,而且还是包含关系?
//不是 obj代表的是上一个对象
boolean b = this.name.equals(u.name);
return b;//b如果是true那么HashSet。add方法收到的是false表示元素相同
}
判断是否重复
public void verify_user() {
if (User_name.add(name)) {
System.out.println("verify success");//添加用户完毕了,如何接着添加下一个用户?
//把新建对象写进方法里面,添加完毕后再次调用这个对象。
} else {
System.out.println("verify failed");
verify_user();
}
}
大概就是这样
完整代码
package JiaXinTest;
import com.google.common.base.Objects;
import javax.xml.namespace.QName;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class User {
private String name;
HashSet User_name = new HashSet();
public User(String name) {
this.name = name;
}
static Scanner scanner = new Scanner(System.in);
String pwd;
String pwd2;
public static void main(String[] args) {
System.out.println("请输入用户名");
String name = scanner.nextLine();
User user = new User(name);
user.verifyPwd();
user.date_of_birth();
System.out.println("手机号码");
String phoneN = scanner.nextLine();
phoneN(phoneN);
user.Email();
user.verify_user();
}
public static void phoneN(String phoneN) {
String regex = "^1[3-9]\\d{9}$";
Pattern pattern = Pattern.compile(regex);//正则表达式如何传递和定义?
Matcher matcher = pattern.matcher(phoneN);
boolean result = matcher.matches();
if (result) {
System.out.println("phone ok");
} else {
System.out.println("your phoneN error");
phoneN = scanner.nextLine();
phoneN(phoneN);
}
}
public void verifyPwd() {
System.out.println("请输入密码");
pwd = scanner.nextLine();
System.out.println("请再次输入密码");
pwd2 = scanner.nextLine();
if (pwd.equals(pwd2)) {
System.out.println("验证通过");
} else {
System.out.println("verify error");
System.out.println("请再次输入密码");
pwd2 = scanner.nextLine();
verifyPwd();
}
}
public void date_of_birth() {
System.out.println("请输入您的出生日期");
String date = scanner.nextLine();
SimpleDateFormat format = new SimpleDateFormat("YY-MM-DD");
try {
format.parse(date);
} catch (Exception E) {
System.out.println("抱歉您输入的格式有误,请按照2002-08-25的格式输入日期");
date_of_birth();
}
}
public void Email() {
System.out.println("请输入您的电子邮箱");
String email = scanner.nextLine();
if (email.contains("@")) {
} else {
System.out.println("您输入的电子邮箱有误,请重新输入");
Email();
}
}
public void verify_user() {
if (User_name.add(name)) {
System.out.println("verify success");//添加用户完毕了,如何接着添加下一个用户?
//把新建对象写进方法里面,添加完毕后再次调用这个对象。
} else {
System.out.println("verify failed");
verify_user();
}
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {//这里传入的obj是指谁?首先这个this是指新元素在被添加时调用了equals方法,那么这个this就是值新元素的新对象
//这样理解对吗?那么当新元素调用了equals方法,他传入的obj是谁呢?难道是所有的老元素吗?
//是的obj就是指所有的老元素。
if (this == obj) {
return true;
}//这里的obj是如何做到代表了上一个对象的?
//别看感叹号,把false改为true就好理解了
if (!(obj instanceof User)) {
return false;
}
User u = (User) obj;//执行这一步的意义?两个的值是一样的对吧,只是类型不一样,而且还是包含关系?
//不是 obj代表的是上一个对象
boolean b = this.name.equals(u.name);
return b;//b如果是true那么HashSet。add方法收到的是false表示元素相同
}
@Override
public String toString() {
return name;
}
}