如何在arraylist中添加有效输入?

时间:2014-01-02 17:44:20

标签: java validation

这是我的ID程序,它存储名字,姓氏,出生日期和地点,电子邮件和电话号码。如何使用有效的出生日期,电子邮件和电话号码制作和存储人物对象(而不是拥有所有属性)?

这是我的主要身份识别计划:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ID {
static List<Oseba> id = new ArrayList<Oseba>();

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int max = 0;
    int choice = 0;
    boolean isDate = false;

    String regEx_Email = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    String regEx_Date = "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)";

    System.out.println("How many IDs would you like to enter? ");
    max = sc.nextInt();

    System.out.println(" 0. Exit. ");
    System.out.println(" 1. Add contact. ");
    System.out.println(" 2. Outprint all contacts. ");
    choice = sc.nextInt();

    while (choice != 0) {

        switch (choice) {
        case 0:
            System.out.println("Goodbye!");
            System.exit(0);

        case 1:
            while (choice != 2) {
                System.out.println("Enter First Name: ");
                String firstName = sc.next();

                System.out.println("Enter Last Name: ");
                String lastName = sc.next();

                System.out.println("Enter date of birth (dd-mm-yyyy): ");
                String date = sc.next();
                isDate = date.matches(regEx_Date);

                System.out.println("Enter place of birth: ");
                String place = sc.next();

                System.out.println("Enter email: ");
                String email = sc.next();

                Pattern p = Pattern.compile(regEx_Email);
                Matcher m = p.matcher(email);

                if (m.find()) {
                    System.out.println(email + " is a valid email address.");
                } else {
                    System.out.println(email + " is a invalid email address");
                }

                System.out.println("Enter phone number:");
                String phone = sc.next();

                addID(firstName, lastName, date, place, email, phone);
            }
            break;

        case 2:
            System.out.println("\n" + ID.id);
            break;

        default:
            System.out.println("Try again.");
            break;
        }
        System.out.println(" 0. Exit. ");
        System.out.println(" 1. Add contact. ");
        System.out.println(" 2. Outprint all contacts. ");
        choice = sc.nextInt();
    }
}

private static void addID(String firstName, String lastName, String date, String place, String email, String phone) {
    Person p = new Person(firstName, lastName, date, place, email, phone);
    id.add(p);
}


}

我的Person课程:

class Person {
  String firstName;
  String lastName;
  String date;
  String place;
  String email;
  String phone;

public Person(String firstName, String lastName, String date, String place, String email, String phone) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.date = date;
    this.place = place;
    this.email = email;
    this.phone = phone;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getPlace() {
    return place;
}

public void setPlace(String place) {
    this.place = place;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public String toString() {
    return "First Name: " + firstName + "\n"
            + "Last Name: " + lastName + "\n"
            + "Date of birth: " + date + "\n" 
            + "Place of birth: "    + place + "\n" 
            + "Email: " + email + "\n"
            + "Phone number: " + phone + "\n\n";
}

}

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

最好的方法是将问题分解为较小的问题。例如,为了验证输入,您将不得不直接调用setter,而是创建一个方法来负责验证每个案例的输入。尝试在任何地方使用这种方法,因为低耦合和高内聚始终是一个要求!我将提供有关您的实现的示例,但是,有多种方法可以做到这一点。我也不会使用例外,因为我注意到你还在开始。

除此之外,为了使其工作,您应该在Person类中添加默认构造函数(值是预定义的)。

最后,尽管没有推荐使用多个while循环的方法,因为它会使代码更复杂,我使用它来向您展示如何确保您将获得正确的输入,例如,如果用户输入没有得到验证,然后程序将继续询问用户,直到它将获得正确的输入。另外,当用户犯了错误时,应该提供指示以引导他/她。 (这通常是在例外情况下完成的,在我们的例子中,虽然我们提供了简单的控制台打印)。

所以让我们看看:

public class ID {
static List<Oseba> id = new ArrayList<Oseba>();
\*we create the menu like that in order to avoid multiple lines repetitions *\
private static String menuOptions = "Menu:" + "\nExit - Insert 0"
            + "\nAdd contact - Insert 1" + "\nExit Outprint all contacts - Insert 2";

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int max = 0;
    int choice = 0;
    boolean isDate = false;

    System.out.println("How many IDs would you like to enter? ");
    max = sc.nextInt();
    Person p = new Person();

    while (true) {
        print(menuOptions);
        choice = sc.nextInt();
        switch (choice) {
        case 0:
            System.out.println("Goodbye!");
            System.exit(0);

        case 1:
                while(true){
                    String fname = getString("Enter First Name: ");
                    if(verifyName(fname)){
                        p.setFirstName(fname);
                        break;
                    }
                }
                while(true){
                    String lname = getString("Enter Last Name: ");
                    if(verifyName(lname)){
                        p.setLastName(lname);
                        break;
                    }
                }
                while(true){
                    String date = getString("Enter date of birth (dd-mm-yyyy): ");
                    if(verifyBirthDate(date)){
                        p.setDate(date);
                        break;
                    }
                }
                while(true){
                    String birthPlace = getString("Enter place of birth: ");
                    if(verifyBirthPlace(birthPlace)){
                        p.setPlace(birthPlace);
                        break;
                    }
                }
                while(true){
                    String email = getString("Enter email address: ");
                    if(verifyEmail(email)){
                        p.setEmail(email);
                        break;
                    }
                }
                while(true){
                    String phoneNumber = getString("Enter phone number: ");
                    if(verifyPhoneNumber(phoneNumber)){
                        p.setPhone(phoneNumber);
                        break;
                    }
                }
                addID(p);
            break;

        case 2:
            System.out.println("\n" + ID.id);
            break;

        default:
            System.out.println("Try again.");
            break;
        }
        print(menuOptions);
        choice = sc.nextInt();
    }
}

    private static void addID(Person prs) {
      id.add(prs);
    }

   public static Boolean verifyName(String name) {
        if(!name.matches("[a-zA-Z]+")){
            print("\nERROR_MESSAGE:____________The first/last name should contain only letters, everything else is not valid!");
            return false;
        }else{
            return true;
        }
    }

    public static Boolean verifyBirthDate(String date) {
        String regEx_Date = "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)";
        if(!date.matches(regEx_Date)){
            print("\nERROR_MESSAGE:____________The birth date is not valid!");
            return false;
        }else{
            return true;
        }
    }

    public static Boolean verifyBirthPlace(String birthPlace) {
        if(!birthPlace.matches("[a-zA-Z]+")){
            print("\nERROR_MESSAGE:____________The birth place is not valid!");
            return false;
        }else{
            return true;
        }
    }


    public static Boolean verifyEmail(String email) {
        String regEx_Email = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
        Pattern p = Pattern.compile(regEx_Email);
        Matcher m = p.matcher(email);
        if(!m.find()){
            print("\nERROR_MESSAGE:____________"+email+" is an invalid email address");
            return false;
        }else{
            return true;
        }
    }

    public static Boolean verifyPhoneNumber(String phoneNumber) {
        if(!phoneNumber.matches("[0-9]+")){
            print("\nERROR_MESSAGE:____________The phone No. should contain only numbers, everything else is not valid!");
            return false;
        }else{
            return true;
        }
    }

    public static String getString(String msg) {
        Scanner in = new Scanner(System.in);
        print(msg);
        String s = in.nextLine();
        return s;
    }

    public static void print(String s) {
        System.out.println(s);
    }


}

答案 1 :(得分:1)

创建一个像这样的构造函数

public Person(String date, String email, String phone) {
    this.date = date;
    this.email = email;
    this.phone = phone;
}

您可以选择添加

this.firstName = null;
this.lastName = null;
//for all of your fields.

您还需要uodate getter和toString方法来检查字段是否已初始化。例如,对于你的getFirstName()

if (firstName!=null)
    return firstName;
return "";

答案 2 :(得分:1)

你听说过Primitive Obsession吗?

我会使用DateJodaDate)代替String出生日期。

我会创建一个Email值对象,如果提供的IllegalArgumentException不是有效的电子邮件(由regexp验证),则抛出String

我会创建一个Phone值对象,如果提供的IllegalArgumentException不是有效的电话号码,则会抛出String

构造函数变为:

public Person(String firstName, String lastName, Date birthDate, String place, Email email, Phone phone)

例如,Email对象将是:

public class Email {

    private String value;

    public Email(String email) {
      if(isNotValid(email))
        throw new IllegalArgumentException("Your mail is not valid!");
      this.value = email;
    }

    public final String getValue(){
      return email;
    } 

    private boolean isNotValid(){
       //return false if email regexp validation is not verified
    }

    //....equals - hashcode if needed here
}

因此,您的Person始终是有效的人。 实际上,检查其组件是否有效是客户的责任,而不是Person的直接责任。通过阅读API,它为读者提供了Person所期望的信息。

答案 3 :(得分:1)

isDate字段的最佳名称是isValidDate

你能使用简单的if语句:

if(isValidDate && m.find())
   addID(firstName, lastName, date, place, email, phone);

或者您可以创建检查验证的方法:

private boolean isValidDate(String date){
 if(number!=null && number!=""){
  String regEx_Date = "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)";
  return date.matches(regEx_Date);
}
return false;
}

答案 4 :(得分:0)

添加一个新的布尔变量以跟踪有效输入。如果所有输入都有效,则只将Person对象添加到ArrayList

            boolean isValid=true;
            if (m.find()) {
                System.out.println(email + " is a valid email address.");
            } else {
                isValid=false;
                System.out.println(email + " is a invalid email address");
            }
            if(isValid)
            {
                //Do other check phone number and valid birth date similarly
            }
            if(isValid)
            {
            addID(firstName, lastName, date, place, email, phone);
            }