Bien que j'écrive en python, je pense que le concept abstrait est plus intéressant pour moi et pour les autres. Donc pseudocode s'il vous plaît si vous aimez :)
J'ai une liste avec des articles d'un de mes cours. Faisons-le avec des chaînes de caractères et des nombres, ça n'a pas vraiment d'importance. Elle est imbriquée à n'importe quelle profondeur. (Ce n'est pas vraiment une liste mais une classe conteneur qui est basée sur une liste).
Exemple : [1, 2, 3, ['a', 'b', 'c'] 4 ['d', 'e', [100, 200, 300]] 5, ['a', 'b', 'c'], 6]
Notez que les deux ['a', 'b', 'c'] sont en réalité le même conteneur. Si vous en modifiez un, vous modifiez l'autre. Les conteneurs et les éléments peuvent être édités, les éléments insérés et, plus important encore, les conteneurs peuvent être utilisés plusieurs fois. Pour éviter la redondance, il n'est pas possible d'aplatir la liste (je pense !) car vous perdez la possibilité d'insérer des éléments dans un conteneur et ils apparaissent automatiquement dans tous les autres conteneurs.
Le problème : Pour le frontal (juste une ligne de commande avec le module python "cmd"), je veux naviguer dans cette structure avec un curseur qui pointe toujours sur l'élément en cours afin qu'il puisse être lu ou modifié. Le curseur peut aller à gauche et à droite (point de vue de l'utilisateur) et doit se comporter comme si la liste n'était pas une liste imbriquée mais une liste plate.
Pour un humain, c'est très facile à faire. Il suffit de faire comme si les sous-listes n'existaient pas dans la liste ci-dessus et d'aller de gauche à droite et inversement.
Par exemple, si vous êtes à la position "3" dans la liste ci-dessus et que vous allez à droite, vous obtenez "a" comme prochain élément, puis "b", "c", puis "4", etc. Ou si vous allez à droite à partir du "300", vous obtenez le "5" suivant.
Et à l'envers : Si vous allez à gauche de "6", le prochain est "C". Si vous allez à gauche de "5", c'est "300".
Alors comment faire en principe ? J'ai une approche ici mais elle est erronée et la question est déjà si longue que je crains que la plupart des gens ne la lisent pas :(. Je peux la poster plus tard.
P.S. Même si c'est difficile de résister : La réponse à cette question n'est pas "Pourquoi voulez-vous faire cela, pourquoi organisez-vous vos données de cette façon, pourquoi n'avez-vous pas [aplatir la liste| quelque chose sorti de mon imagination] d'abord ? Le problème est exactement ce que j'ai décrit ici, rien d'autre. Les données sont structurées par la nature du problème de cette façon.
0 votes
Vous aurez plus de chances d'obtenir des réponses si vous affichez un code qui ne fonctionne pas et si vous posez des questions plus spécifiques.
0 votes
Il est apparu clairement que le problème n'est pas de se déplacer vers la droite, mais de revenir vers la gauche. Dans l'exemple ci-dessus, le retour en arrière à partir de "5" devrait être de 300, et non au début du conteneur, qui est "d".
0 votes
@rolf, quel problème rencontrez-vous lorsque vous vous déplacez vers la gauche ? J'ai également mis en œuvre une approche basée sur la pile pour le plaisir, mais un problème délicat a causé ma
left
échoue -- les indices négatifs sont toujours dans la plage si vous utilisez le test d'exception, donc il itère à l'envers sur les listes intérieures deux fois ! (c.-à-d.l[2], l[1], l[0], l[-1], l[-2], l[-3]
). Peut-être est-ce également votre problème ?1 votes
@rolf, en tout cas, j'ai collé l'implémentation fonctionnelle aquí .