Java 防止重复(唯一护照)
我试图阻止用户使用相同的passport添加2名attendee我尝试了很多方法,比如制作布尔变量来检查attendee是否在之前添加过,但我所有的尝试都失败了,我真的想不出一个方法来实现这一点Java 防止重复(唯一护照),java,oop,computer-science,Java,Oop,Computer Science,我试图阻止用户使用相同的passport添加2名attendee我尝试了很多方法,比如制作布尔变量来检查attendee是否在之前添加过,但我所有的尝试都失败了,我真的想不出一个方法来实现这一点 public class Test { public static void main(String[] args) { try { Workshop Available_Work_Shops = new Workshop(); S
public class Test {
public static void main(String[] args) {
try {
Workshop Available_Work_Shops = new Workshop();
Scanner sc = new Scanner(System.in);
String passportNumber, workshop;
boolean isAttendeeMatch;
ArrayList<Attendee> attendeeList = new ArrayList<>();
int choice;
do {
System.out.println("1. Add New Attendee");
System.out.println("2. Add Existing Attendee to Workshop");
System.out.println("3. Remove Attendee from Workshop");
System.out.println("4. Print WorkShop List");
System.out.println("5. Print All Attendees");
System.out.println("0. Close Program");
System.out.println("Please Enter a number to choose");
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
case 1 -> {
System.out.println();
System.out.println("Adding New Attendee");
System.out.println("____________________");
System.out.print("Please Enter Attendee Name: ");
String Attendee_name = sc.nextLine();
System.out.print("Please Enter Attendee Passport Number: ");
String Attendee_passport = sc.nextLine();
System.out.print("Please Enter Attendee Age: ");
String Attendee_Age = sc.nextLine();
System.out.print("Please Enter Attendee Phone Number: ");
String phone = sc.nextLine();
attendeeList.add(new Attendee(Attendee_name, Attendee_Age, Attendee_passport, phone));
for (Attendee attendee : attendeeList) {
if (attendeeList.contains(attendee.PassportNumber)) {
System.out.println("Existing User Found please enter '3' to remove the duplicate user");
}
}
}
公共类测试{
公共静态void main(字符串[]args){
试一试{
车间可用\工作\车间=新车间();
扫描仪sc=新的扫描仪(System.in);
字符串密码,车间;
布尔Isattendematch;
ArrayList AttendeList=新建ArrayList();
智力选择;
做{
System.out.println(“1.添加新与会者”);
System.out.println(“2.将现有与会者添加到研讨会”);
System.out.println(“3.将与会者从研讨会中移除”);
System.out.println(“4.打印车间列表”);
System.out.println(“5.打印所有与会者”);
System.out.println(“0.关闭程序”);
System.out.println(“请输入要选择的数字”);
choice=sc.nextInt();
sc.nextLine();
开关(选择){
案例1->{
System.out.println();
System.out.println(“添加新与会者”);
System.out.println(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”);
System.out.print(“请输入与会者姓名:”);
字符串Attendee_name=sc.nextLine();
系统输出打印(“请输入与会者护照号码:”);
字符串Attendee_passport=sc.nextLine();
System.out.print(“请输入与会者年龄:”);
字符串Attendee_Age=sc.nextLine();
System.out.print(“请输入与会者电话号码:”);
字符串phone=sc.nextLine();
添加(新与会者(与会者姓名、年龄、护照、电话);
用于(与会者:与会者列表){
if(AttendeList.contains(attendee.PassportNumber)){
System.out.println(“找到现有用户请输入'3'删除重复用户”);
}
}
}
我马上就发现了一些可能会破坏代码的问题:
if(AttendeList.contains(attendee.PassportNumber))
将永远不会返回true
,因为您正在检查整个列表
中是否有一个与PassportNumber
相等的对象(与对象中的PassportNumber
相反)。它应该是if(attendee.getPassportNumber().equals(Attendee_passport))
List
作为声明的变量类型,而不是ArrayList
,以及使用Java流过滤列表以查看是否已经存在某些内容。Java还具有Set
作为List
的替代方法,用于仅存储唯一值的情况(在列表
和设置
之间还有其他区别,所以如果你想使用它,一定要查看它)。问题
让我们关注这两条线
。。。
用于(与会者:与会者列表){
if(AttendeList.contains(attendee.PassportNumber)){
...
由于您已将AttendeList
定义为一个ArrayList
保存Attendee
对象,因此应该将Attendee
对象传递给AttendeList.contains()
。而contains()
函数只有当列表中的一个元素等于()时才会返回true
您传入的对象
解决方案
我建议更改这段代码
attendelist.add(新与会者(与会者姓名、年龄、护照、电话));
用于(与会者:与会者列表){
if(AttendeList.contains(attendee.PassportNumber)){
System.out.println(“找到现有用户请输入'3'删除重复用户”);
}
}
…像这样的事情
Attendee potentialAttendee=新与会者(与会者姓名、年龄、护照、电话)
//检查潜在与会者的护照号码是否已被列表中的人使用。
布尔passportRegistered=false;
用于(与会者:与会者列表){
if(attendee.PassportNumber.equals)(潜在attendee.PassportNumber){
System.out.println(“该用户护照号码已注册,无法再次添加”);
passportRegistered=true;
}
}
//仅当列表中的某人尚未使用其护照号码时,才添加潜在与会者。
如果(!passportRegistered){
AttendeList.add(潜在与会者);
}
关键的区别在于,您不应该将潜在与会者添加到列表中,除非您首先确认他/她符合要添加到该列表中的要求
潜在增强
- 将与会者存储在HashMap而不是ArrayList中。如果您键入了PassportNumber,则根据定义,与会者集合中不能有两个具有相同PassportNumber的参与者
- Java有一个很好的流式API,可以使验证更接近一行程序