2011-01-14 7 views
-1

Ich habe eine Stammbaum-App, mit der Sie Knoten erstellen können. Ich stecke an einem Problem fest, das die Änderung des Geburtsdatums eines Mitglieds erfordert. Das Geburtsdatum ist nur eine Zeichenfolge im folgenden Format TT-MM-JJJJ. Mein Problem tritt auf, wenn geprüft wird, ob das Geburtsdatum gültig ist (d. H. Jeder Elternteil darf nicht jünger als ein Kind sein). Wenn der Knoten sowohl Eltern als auch Kinder hat und der Benutzer das Geburtsdatum ändern möchte, muss die Funktion kontinuierlich prüfen, ob ein Alter zwischen den beiden Daten hinzugefügt wurde. Das Problem, das ich habe, besteht darin, diese kontinuierliche Überprüfung mit den von mir definierten Methoden durchzuführen. Ich hoffe, dass jemand die Isue versteht und helfen kann. Hinweis checkDOb setzt auch das dob. seine schlechte Namensgebung von meiner Seite.Logisches Problem - Java

hier ist der Code:

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); 
} 

Vielen Dank im Voraus.

+2

muss es wirklich rekursiv sein? Warum überprüfen Sie nicht nur die Daten der direkten Eltern? Wenn Sie alle Änderungen validieren, sind diese bis zur Wurzel gültig. – Mauricio

+0

Einverstanden.Obwohl Sie keinen Stammknoten in einem Stammbaum haben. –

+0

Sie rufen 'DateValidator.isValid' auf, wie es mit recursiveDateCheck verbunden ist? Wie benutzt man die 'int gen' Variable? –

Antwort

0

Nun die Standardmethode zum Analysieren von Daten verwendet SimpleDateFormat. Aber ich denke nicht, dass das in deinem Fall helfen wird, also werde ich nicht dorthin gehen.

Aber Sie sollten Date-Objekte verwenden (oder, wie andere sagen: verwenden Sie das DateTime-Objekt von JodaTime), wenn Sie über Termine sprechen, macht es die Dinge einfacher.

machen Date die Art der dob

und tauschen Sie diesen Code:

String dob = d + m + y; 

hierfür:

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(); 

(Sie alle if (m.length() == 1) Sachen verlieren sollte, weil Strings mit führenden Nullen wird als oktale Werte analysiert)

Jetzt

Sie können nur bestätigen, dass parentBirthDate.compareTo(childBirthDate)>0

, auch genauer zu sein, sollten Sie alle Felder gestutzt, die kleiner als Tag sind:

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

auch: nicht System.out.println() verwenden, verwenden Sie ein Logging-Framework wie Log4J oder SLF4J.

Oh, BTW, zu bestätigen, dass das Kind jünger als die Eltern ist, wird nicht genug sein. Sie müssen wahrscheinlich bestätigen, dass die Differenz 12 Jahre oder mehr :-)

0

Es kann wie

//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

smt werden Sie sollten Ihre Validierung und Dateneingabe entkoppeln. Zu Beginn haben Sie Ihr Baummodell mit den aktuellen Werten und einer neuen Zeichenfolge, die Sie eingeben möchten, um einen Wert zu ändern.

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 
} 

Nun, da Sie eine Stand-alone-Validierungsmethode haben, sollten Sie es jederzeit anrufen können Sie über einen neuen Knoten oder zu ändern, ein hinzuzufügen. Ändern Sie keine Werte im tatsächlichen Datenmodell, bis diese validiert wurden. Dies bedeutet, dass sich Ihr Baum immer in einem gültigen Status befindet und eine Bearbeitung nur eine lokale Operation ist.