Je ne peux pas sembler trouver une solution à mon problème de récursivité. Donc, j'ai cet objet de version qui détient une liste de références à d'autres objets de version dépendants de.
version p> lorsque je récupère cet objet, je dois aussi récupérer cet objet. C'est des dépendances aussi des dépendances de la dépendance jusqu'à ce qu'il y ait une fin éventuelle, qui ressemblerait à quelque chose comme celle-ci p> VERSIONDO P> public VersionDto getVersion(String id)
{
//Check global list contains version
if (visited.contains(id)) {
return null;
}
visited.add(docId);
//Retrieves from database
Version version = versionDAO.getVersion(id);
//Convert to Dto (basic fields)
VersionDto versionDto = new VersionDto(version);
//Recursivly retrieve dependencies
for (Map<String, String> dep : version.getDependencies()) {
VersionDto dto = new VersionDto();
//Recursive call
dto = getVersion(dep.get("id"));
if(dep!= null) {
versionDto.getDependencies().add(dto);
}
}
return versionDto;
}
3 Réponses :
Le meilleur moyen d'être sûr que les fonctions récursives se termineront, est de mettre une ou plusieurs conditions. Vous doit strong> en avez-en un, pour vous assurer qu'il n'allait pas dans une boucle infinie. P>
Je suggérerais de créer une matrice ou une liste, où vous stockez tous les nœuds déjà visités, alors lors de l'exécution de la fonction récursive, vous pouvez savoir que vous avez déjà visité un nœud et peut passer à une autre. p>
J'ai d'abord passé une liste via chaque nœud qui garderait la trace ce qui a été visité dans ce chemin qui a fonctionné mais qui avait encore une boucle inutile. Ensuite, j'ai essayé une liste mondiale qui a travaillé beaucoup mieux merci.
Génial! Heureux d'avoir aidé!
J'espère que cela aide.
Si la dépendance de V1 va toujours être la même chose que cela fonctionne. p>
Le problème infini de boucle récursif peut être résolu de manière très efficace à l'aide de bibliothèques Jackson. Les bibliothèques Jackson sont utiles, en particulier si vous utilisez Hibernate / JPA pour la persistance. À savoir, les annotations @jsonmaningReference et @jsonbackreference s'appliqueraient à votre cas. p>
Vous n'avez pas montré votre code d'entité JPA, je ne peux donc pas vous dire où vous devez mettre ces annotations. Mais, un bon exemple de la façon de les utiliser est disponible à P>
http: //springquay.blogspot .COM / 2016/01 / Nouveau-approche-to-Solve-Json-Rursive.html P>
J'espère que vous le trouverez utile! P>
Intéressant, devra regarder plus dans cela. Merci
En bref: vous devez soit marquer des nœuds déjà visités, soit pour conserver un enregistrement des nœuds que vous avez déjà visités. Dans les deux cas, vous devez vérifier, sur la rencontre d'un nœud, que vous l'avez déjà visité.
Quel comportement, spécifiquement i>, voulez-vous? Vos données ont une boucle et votre code est consciencieux à la suite de cette boucle.
Vous devriez avoir une structure de toutes les VisitésDoTo et ne les ajoutez que si elles ne sont pas sur la liste. Peut-être que si vous ajoutez plus d'informations sur les structures de données, je peux fournir des informations supplémentaires.
Dans toutes les fonctions récursives, vous devriez avoir une condition d'extrémité pour éviter l'empilement. Peut-être que vous pourriez conserver une structure temporaire qui définit les dépendances déjà explorées?