【问题标题】:Logic Problem - Java逻辑问题 - Java
【发布时间】:2011-01-14 20:04:41
【问题描述】:

我有一个允许您构建节点的家谱应用程序。我遇到了一个需要编辑成员出生日期的问题。出生日期只是一个字符串,格式为 dd-mm-yyyy。在检查出生日期是否有效时出现了我的问题(即任何父母都不能比孩子年轻)。因此,如果节点有父母和孩子,并且用户选择编辑它的出生日期,该函数必须不断检查是否添加了两个日期之间的年龄。我遇到的问题是使用我定义的方法进行这种持续检查。我希望有人了解这个问题并可以提供帮助。注意 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);
}

提前致谢。

【问题讨论】:

  • 真的需要递归吗?你为什么不只检查直系父母的日期?如果您正在验证所有编辑,那么直到根目录都是有效的。
  • 同意。尽管您在家族树中并没有真正的根节点。
  • 你调用DateValidator.isValid它是如何与recursiveDateCheck连接的?你如何使用'int gen'变量?
  • 嗨,对不起,首先它不需要递归,它只需要确保输入的日期在最大的孩子和最小的父母的日期之间。我可以评估最大的孩子和最小的父母,但需要将其实现到我的 checkDob 函数中。我不确定如何在不弄乱很多其他代码的情况下做到这一点!日期验证器检查日期是否早于今天的日期,以及月份、日期和年份是否是有效输入。它实际上只是检查用户是否没有输入像 99-00-2100 这样的内容作为 dob
  • 这段代码到处都是。为什么不从人的模型和他们的关系的模型开始。您还应该查看 DateFormat。我不太了解代码,但看起来大部分可以用 FamilyMember 上的新方法 getOldestParent() 替换

标签: java unit-testing logic


【解决方案1】:

解析日期的标准方法是使用SimpleDateFormat。但我认为这对你的情况没有帮助,所以我不会去那里。

但是当你谈论日期时,你应该使用 Date 对象(或者,正如其他人所说:使用 JodaTime 的 DateTime 对象),这会让事情变得更容易。

使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 年或更长时间:-)

【讨论】:

    【解决方案2】:

    它可以像 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); 
        }
    }
    

    【讨论】:

      【解决方案3】:

      您应该将验证和数据输入分离。首先,您的树模型包含当前值和要输入以更改值的新字符串。

      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
      }
      

      现在您有了一个独立的验证方法,您应该在要添加新节点或编辑节点时调用它。在实际数据模型经过验证之前,请勿更改任何值这意味着您的树将始终处于有效状态,并且编辑只是本地操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多