import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Arrays; /** MonBrin code un brin d'ADN sous forme de tableaux. Dynamiquement, la taille du tableau est augmentée en cas de besoin (la taille est initialement 3*4 elle est multipliée ensuite pour être toujours de la forme 3*2^n). On utilise System.arraycopy et java.util.Arrays.copyOfRange pour faire ça efficacement. voir https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang.Object-int-int- https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#copyOfRange-T:A-int-int- Cette version est correcte : la structuration et la navigation sont dans 2 classes séparées. La classe MonBrin implémente Iterable au sens où elle peut générer à la demande un objet Iterator. NB : Notez que j'implémente Iterable plutôt que Iterable qui n'était pas tout à fait propre c'est un peu technique et c'est lié aux types génériques. Il y a des détails ici https://stackoverflow.com/questions/20790770/why-cant-i-assign-a-raw-type-to-a-parameterized-type-java?rq=1 */ public class MonBrin implements Iterable { private Base[] bases; // Tableau pour stocker les bases private int length; // Nombre d'éléments dans le tableau private int currentIndex; // Indice actuel pour la navigation private static final int INITIAL_CAPACITY = 12; // Capacité initiale // Constructeur pour initialiser le brin avec une seule base public MonBrin(Base b) { this.bases = new Base[INITIAL_CAPACITY]; this.bases[0] = b; this.length = 1; this.currentIndex = 0; // Initialiser l'indice de navigation } // Constructeur pour ajouter une base devant un autre brin public MonBrin(Base b, MonBrin l) { this.bases = Arrays.copyOf(l.getBases(), l.capacity()); this.bases[0] = b; this.length = l.length + 1; this.currentIndex = 0; // Initialiser l'indice de navigation } // Méthode pour garantir que le tableau a suffisamment d'espace private void ensureCapacity() { if (length >= bases.length) { bases = Arrays.copyOf(bases, bases.length * 2); // Double la capacité } } // Méthode pour ajouter une base public void addBase(Base b) { ensureCapacity(); // Vérifie que le tableau a assez de place bases[length] = b; // Ajoute la nouvelle base length++; } // Retourne la base à un index donné public Base getBase(int i) { if (i < 0 || i >= length) { throw new IndexOutOfBoundsException("Index hors limites"); } return bases[i]; } // Retourne toutes les bases sous forme de tableau public Base[] getBases() { return Arrays.copyOf(bases, length); } // Retourne la capacité actuelle public int capacity() { return bases.length; } // Retourne la longueur actuelle (le nombre de bases) public int length() { return length; } // Retourne la limite (identique à length ici) public int limit() { return length; } // Réinitialise l'indice de navigation (permet de refaire un parcours) public void reset() { this.currentIndex = 0; } // Méthode pour obtenir un itérateur sur les bases @Override public Iterator iterator() { return new MonBrinIterator(this); } @Override public String toString() { StringBuilder sb = new StringBuilder(); // Parcours des bases jusqu'à la longueur réelle (pas la capacité) for (int i = 0; i < length; i++) { sb.append(bases[i]).append(" "); } return sb.toString().trim(); } }