2011-01-14 3 views
-1

J'ai une application de l'arbre généalogique qui vous permet de construire des nœuds. Je suis bloqué sur un problème qui nécessite de modifier la date de naissance d'un membre. La date de naissance est juste une chaîne dans le format suivant jj-mm-aaaa. Mon problème survient lorsque je vérifie si la date de naissance est valide (c'est-à-dire que tout parent ne peut pas être plus jeune qu'un enfant). Donc, si le noeud a à la fois des parents et des enfants et que l'utilisateur choisit de modifier sa date de naissance, la fonction doit continuellement vérifier si un âge entre les deux dates a été ajouté. Le problème que j'ai est d'obtenir cette vérification continuelle en utilisant les méthodes que j'ai définies. J'espère que quelqu'un comprend la situation et peut aider. Remarque checkDOb définit également le dob aussi. son mauvais nom de ma part.Problème de logique - Java

est ici le 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); 
} 

Merci à l'avance.

+2

il doit vraiment être récursif? Pourquoi ne vérifiez-vous pas seulement les dates du parent immédiat? Si vous validez toutes les modifications, alors jusqu'à la racine sera valide. – Mauricio

+0

D'accord.Bien que vous n'ayez pas vraiment de nœud racine dans un arbre généalogique. –

+0

Vous appelez 'DateValidator.isValid' comment il s'est connecté avec recursiveDateCheck? Comment utilisez-vous la variable 'int gen'? –

Répondre

0

Eh bien, la façon standard d'analyser les dates utilise SimpleDateFormat. Mais je ne pense pas que cela vous aidera dans votre cas, alors je ne vais pas y aller. Mais vous devriez utiliser les objets Date (ou, comme d'autres diront: utiliser l'objet DateTime de JodaTime) quand vous parlez de Dates, cela facilite les choses.

faire Date le type de dob

et échanger ce code:

String dob = d + m + y; 

pour cela:

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

(vous devez perdre tous les trucs if (m.length() == 1), parce que les chaînes avec des zéros non significatifs sera analysé en tant que valeurs octales)

Maintenant, vous pouvez simplement confirmer que parentBirthDate.compareTo(childBirthDate)>0

En outre, pour être plus précis, vous devez tronquer tous les champs qui sont plus petits que le jour:

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

aussi: ne pas utiliser System.out.println(), utilisez un cadre de l'exploitation forestière comme Log4J ou SLF4J. Oh, BTW, valider que l'enfant est plus jeune que le parent ne sera pas suffisant. Vous devrez probablement valider que la différence est de 12 ans ou plus :-)

0

Il peut être Smt comme

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

Vous devez découpler votre validation et la saisie des données. Pour commencer, vous avez votre modèle d'arbre avec les valeurs actuelles et une nouvelle chaîne que vous voulez entrer pour changer une valeur.

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 
} 

Maintenant que vous avez une méthode de validation autonome, vous devriez l'appeler à tout moment vous êtes sur le point d'ajouter un nouveau nœud ou modifier un. Ne modifiez aucune valeur dans le modèle de données réel tant qu'il n'a pas été validé. Cela signifie que votre arborescence sera toujours dans un état valide et qu'une modification est simplement une opération locale.