Java 防止重复(唯一护照)

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

我试图阻止用户使用相同的passport添加2名attendee我尝试了很多方法,比如制作布尔变量来检查attendee是否在之前添加过,但我所有的尝试都失败了,我真的想不出一个方法来实现这一点

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))
  • 不知道你是多少初学者,但研究一下命名约定(一般来说,Java变量应该用小写字母命名,每个新词都有大写字母)也可能很有用,使用
    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,可以使验证更接近一行程序

    非常感谢您:d感谢您的帮助:d