Проблема логики - Java - PullRequest
       4

Проблема логики - Java

0 голосов
/ 14 января 2011

У меня есть приложение на основе семейного дерева, которое позволяет вам строить узлы. Я застрял на проблеме, которая требует редактирования даты рождения участников. Дата рождения - это просто строка в следующем формате дд-мм-гггг. Моя проблема возникает при проверке правильности даты рождения (то есть любой родитель не может быть моложе ребенка). Поэтому, если на узле есть как родители, так и дети, и пользователь выбирает для редактирования дату своего рождения, функция должна постоянно проверять, был ли добавлен возраст между двумя датами. Проблема, с которой я сталкиваюсь, заключается в том, чтобы эта непрерывная проверка выполнялась с использованием определенных мной методов. Я надеюсь, что кто-то понимает проблему и может помочь. Обратите внимание, что checkDOb также устанавливает dob. это плохое название с моей стороны.

вот код:

private void dateCheck(FamilyMember node) {
    String dob = enterDateOfBirth();
    if (node.hasChildren()) {
        node.setDob(dob);
        checkDob(node, node.getOldestChild(), 0);            
    }

    FamilyMember parent = null;
    if (node.hasMother() && node.hasFather()) {
        if (node.getMother().getAge() > node.getFather().getAge()) {
            parent = node.getFather();
        } else {
            parent = node.getMother();
        }
        checkDob(parent, node, 1);
    } else {
        //single parent
        if (node.hasMother()) {
            parent = node.getMother();
            checkDob(parent, node, 1);
        }

        if (node.hasFather()) {
            parent = node.getFather();
            checkDob(parent, node, 1);
        }
    }
}

private void checkDob(FamilyMember parent, FamilyMember child, int member) {
    out.println(parent.getYear());
    out.println(child.getYear());
    while (parent.getYear() > child.getYear()) {
        out.println("Invalid Date - The Oldest Child of " + parent.getFullName()
                + "(" + child.getFullName() + ")\n cannot older than his/her parents. Try Again.");
        out.println();
        if (member == 0) {
            parent.setDob(enterDateOfBirth());
        }
        if (member == 1) {
            child.setDob(enterDateOfBirth());
        }
    }
}

private String enterDateOfBirth() {
    out.print("Enter Year Of Birth (0 - 2011): ");
    String y = in.nextLine();

    out.print("Enter Month Of Birth (1-12): ");
    String m = in.nextLine();
    if (m.trim().equals("")) {
        m = "0";
    }
    if (m.length() == 1) {
        m = "0" + m;
    }
    m += "-";

    out.print("Enter Date of Birth (1-31): ");
    String d = in.nextLine();

    if (d.trim().equals("")) {
        d = "0";
    }
    if (d.length() == 1) {
        d = "0" + d;
    }
    d += "-";

    String dob = d + m + y;
    while (!DateValidator.isValid(dob)) {
        out.println("Invalid date. Try again.");
        dob = enterDateOfBirth();
    }
    return (dob);
}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 14 января 2011

Это может быть smt как

//return true if one of arguments is true!
private boolean bornBefore(FamilyMember first, FamilyMember second){
    if(first == null || second == null){
        return true;
    }
    return /*your magic date comaparator*/;
}
private boolean validDate(FamilyMember node, MagicDate date) {
    return bornBefore(node, node.getOldestChild())
            && bornBefore(node.getFather(), node)
            && bornBefore(node.getMother(), node); 
    }
}
0 голосов
/ 14 января 2011

Вы должны отделить вашу проверку и ввод данных. Для начала у вас есть модель дерева с текущими значениями и новая строка, которую вы хотите ввести, чтобы изменить значение.

bool checkDOB(String date, FamilyMember node) {
  //return true if date is more recent than any parents of node and
  //older than any children of node
}

Теперь, когда у вас есть автономный метод проверки, вы должны вызывать его каждый раз, когда собираетесь добавить новый узел или отредактировать его. Не изменяйте никакие значения в фактической модели данных, пока она не будет проверена. Это означает, что ваше дерево всегда будет в допустимом состоянии, а редактирование - это просто локальная операция.

0 голосов
/ 14 января 2011

Ну, стандартный способ разбора дат - SimpleDateFormat. Но я не думаю, что это поможет вам, поэтому я не пойду туда.

Но вы должны использовать объекты Date (или, как другие скажут: используйте объект DateTime JodaTime), когда вы говорите о датах, это упрощает задачу.

делает Date тип dob

и обменяйте этот код:

String dob = d + m + y;

для этого:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(y));
cal.set(Calendar.MONTH, Integer.parseInt(m)-1);
cal.set(Calendar.DATE, Integer.parseInt(d));
Date dob = cal.getTime();

(вы должны потерять все вещи if (m.length() == 1), потому что строки с начальными нулями будут анализироваться как восьмеричные значения)

Теперь вы можете просто подтвердить, что parentBirthDate.compareTo(childBirthDate)>0

Также, чтобы быть более точным, вы должны усечь все поля, которые меньше, чем день:

cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

Также: не используйте System.out.println(), используйте каркас журналирования, такой как Log4J или SLF4J.

Да, кстати, подтверждения того, что ребенок младше родителя, будет недостаточно. Вам, вероятно, придется подтвердить, что разница составляет 12 лет и более: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...