tout marche sauf le dernier
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,31 @@
|
||||
// Fichier Exemple pour le premier exercice sur l'ADN
|
||||
|
||||
public class Exemple{
|
||||
public static void main(String[] args) {
|
||||
// codon GCT code l'analine https://en.wikipedia.org/wiki/DNA_codon_table
|
||||
// stop codon TAG, voir https://en.wikipedia.org/wiki/Stop_codon
|
||||
|
||||
System.out.println("construction du brin GCTTAG");
|
||||
MonMaillon l = new MonMaillon(Base.G);
|
||||
l = new MonMaillon(Base.A,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.C,l);
|
||||
l = new MonMaillon(Base.G,l);
|
||||
|
||||
MonBrin b = new MonBrin(l);
|
||||
|
||||
System.out.println("l'affichage par défaut du brin ne va pas vous plaire");
|
||||
System.out.println(b.toString());
|
||||
|
||||
|
||||
System.out.println("On peut afficher en avançant");
|
||||
System.out.println("Il faut s'en inspirer pour implémenter l'interface iterator de Java.util");
|
||||
MonMaillon actuel = b.getDebut();//NB: c'est comme l ci-dessus
|
||||
|
||||
while (actuel != null){
|
||||
System.out.println(actuel.getBase());
|
||||
actuel = actuel.getSuiteMaillon();
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
MonBrin code un brin d'ADN sous forme de liste simplement chaînée.
|
||||
|
||||
Plusieurs instances de MonMaillon reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
Cette version a un problème : la navigation n'est pas raisonnable
|
||||
*/
|
||||
public class MonBrin {
|
||||
private MonMaillon debut;
|
||||
private MonMaillon courant;
|
||||
|
||||
public MonBrin(MonMaillon p) {
|
||||
this.debut = p;
|
||||
this.courant = p; // Initialiser courant pour le parcours
|
||||
}
|
||||
|
||||
public MonMaillon getDebut() {
|
||||
return this.debut;
|
||||
}
|
||||
|
||||
// Méthode hasNext pour vérifier s'il y a un élément suivant
|
||||
public boolean hasNext() {
|
||||
return courant != null;
|
||||
}
|
||||
|
||||
// Méthode next pour obtenir la base actuelle et avancer
|
||||
public Base next() {
|
||||
if (!hasNext()) {
|
||||
throw new RuntimeException("No more elements in the brin.");
|
||||
}
|
||||
Base baseActuelle = courant.getBase();
|
||||
courant = courant.getSuiteMaillon(); // Avancer au maillon suivant
|
||||
return baseActuelle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
MonMaillon temp = this.debut;
|
||||
while (temp != null) {
|
||||
sb.append(temp.getBase()).append(" ");
|
||||
temp = temp.getSuiteMaillon();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
public class MonBrin {
|
||||
|
||||
//Le constructeur fabrique un brin à partir du premier maillon p;
|
||||
public MonBrin(MonMaillon p){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getDebut(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
et pour naviguer?
|
||||
On pourrait implémenter l'interface iterator de java.util ici
|
||||
|
||||
}
|
||||
*/
|
||||
Binary file not shown.
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
MonMaillon code un maillon d'un brin d'ADN.
|
||||
plusieurs instances reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
*/
|
||||
public class MonMaillon {
|
||||
private Base base;
|
||||
private MonMaillon suivant;
|
||||
|
||||
// Constructeur pour un seul maillon avec une base
|
||||
public MonMaillon(Base b) {
|
||||
this.base = b;
|
||||
this.suivant = null;
|
||||
}
|
||||
|
||||
// Constructeur pour ajouter un maillon à une chaîne existante
|
||||
public MonMaillon(Base b, MonMaillon l) {
|
||||
this.base = b;
|
||||
this.suivant = l;
|
||||
}
|
||||
|
||||
public Base getBase() {
|
||||
return this.base;
|
||||
}
|
||||
|
||||
public MonMaillon getSuiteMaillon() {
|
||||
return this.suivant;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
public class MonMaillon {
|
||||
|
||||
//Le constructeur de base retourne un brin à une base;
|
||||
public MonMaillon(Base b){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
// Le constructeur évolué ajoute une base à un brin.
|
||||
public MonMaillon(Base b, MonMaillon l){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public Base getBase(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getSuiteMaillon(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,34 @@
|
||||
// Fichier Exemple pour le second exercice sur l'ADN
|
||||
|
||||
public class Exemple{
|
||||
public static void main(String[] args) {
|
||||
// codon GCT code l'analine https://en.wikipedia.org/wiki/DNA_codon_table
|
||||
// stop codon TAG, voir https://en.wikipedia.org/wiki/Stop_codon
|
||||
|
||||
System.out.println("construction du brin GCTTAG");
|
||||
MonMaillon l = new MonMaillon(Base.G);
|
||||
l = new MonMaillon(Base.A,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.C,l);
|
||||
l = new MonMaillon(Base.G,l);
|
||||
|
||||
MonBrin b = new MonBrin(l);
|
||||
|
||||
System.out.println("l'affichage par défaut du brin ne va pas vous plaire");
|
||||
System.out.println(b.toString());
|
||||
|
||||
System.out.println("On peut maintenant afficher en itérant avec un while comme ceci");
|
||||
|
||||
while (b.hasNext()){
|
||||
System.out.println(b.next());
|
||||
}
|
||||
|
||||
// ajouter du code ici pour gérer les questions en plus
|
||||
// (simulation de plusieurs navigations successives)
|
||||
|
||||
|
||||
// (simulation de plusieurs navigations simultanées)
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,90 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
/**
|
||||
MonBrin code un brin d'ADN sous forme de liste simplement chaînée.
|
||||
|
||||
Plusieurs instances de MonMaillon reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
Cette version a un problème : la structuration et la navigation sont dans la même classe.
|
||||
*/
|
||||
|
||||
/*
|
||||
public class MonBrin implements Iterator<Base>{
|
||||
|
||||
public MonBrin(MonMaillon p){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getDebut(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
|
||||
// rappel : on met @Override pour dire au compilateur qu'on veut surcharger (en particulier c'est le cas quand on implémente une interface)
|
||||
// ce n'est pas nécessaire dans ce cas mais ça permet d'avoir des messages d'alerte si on se trompe (typo dans le nom de la méthode ...)
|
||||
// voir https://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why
|
||||
@Override
|
||||
public boolean hasNext(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Base next() {
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
throw new NoSuchElementException();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
import java.util.Iterator;
|
||||
|
||||
public class MonBrin implements Iterator<Base> {
|
||||
private MonMaillon debut;
|
||||
private MonMaillon courant;
|
||||
|
||||
// Constructeur qui initialise le brin et la position courante
|
||||
public MonBrin(MonMaillon p) {
|
||||
this.debut = p;
|
||||
this.courant = p; // Initialiser courant pour le parcours
|
||||
}
|
||||
|
||||
public MonMaillon getDebut() {
|
||||
return this.debut;
|
||||
}
|
||||
|
||||
// Méthode hasNext pour vérifier s'il y a un élément suivant
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return courant != null;
|
||||
}
|
||||
|
||||
// Méthode next pour obtenir la base actuelle et avancer
|
||||
@Override
|
||||
public Base next() {
|
||||
if (!hasNext()) {
|
||||
throw new RuntimeException("No more elements in the brin.");
|
||||
}
|
||||
Base baseActuelle = courant.getBase();
|
||||
courant = courant.getSuiteMaillon(); // Avancer au maillon suivant
|
||||
return baseActuelle;
|
||||
}
|
||||
|
||||
// Méthode pour réinitialiser le parcours du brin
|
||||
public void reset() {
|
||||
this.courant = this.debut;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
MonMaillon temp = this.debut;
|
||||
while (temp != null) {
|
||||
sb.append(temp.getBase()).append(" ");
|
||||
temp = temp.getSuiteMaillon();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
MonMaillon code un maillon d'un brin d'ADN.
|
||||
plusieurs instances reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
*/
|
||||
/*
|
||||
public class MonMaillon {
|
||||
|
||||
|
||||
public MonMaillon(Base b){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon(Base b, MonMaillon l){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public Base getBase(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getSuiteMaillon(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
public class MonMaillon {
|
||||
private Base base;
|
||||
private MonMaillon suivant;
|
||||
|
||||
public MonMaillon(Base b) {
|
||||
this.base = b;
|
||||
this.suivant = null;
|
||||
}
|
||||
|
||||
public MonMaillon(Base b, MonMaillon l) {
|
||||
this.base = b;
|
||||
this.suivant = l;
|
||||
}
|
||||
|
||||
public Base getBase() {
|
||||
return this.base;
|
||||
}
|
||||
|
||||
public MonMaillon getSuiteMaillon() {
|
||||
return this.suivant;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
// Fichier Exemple pour le dernier exercice sur l'ADN (Iterable)
|
||||
|
||||
public class Exemple{
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
// codon GCT code l'analine https://en.wikipedia.org/wiki/DNA_codon_table
|
||||
// stop codon TAG, voir https://en.wikipedia.org/wiki/Stop_codon
|
||||
|
||||
System.out.println("construction du brin GCTTAG");
|
||||
MonMaillon l = new MonMaillon(Base.G);
|
||||
l = new MonMaillon(Base.A,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.T,l);
|
||||
l = new MonMaillon(Base.C,l);
|
||||
l = new MonMaillon(Base.G,l);
|
||||
|
||||
MonBrin m = new MonBrin(l);
|
||||
|
||||
System.out.println("l'affichage par défaut du brin ne va pas vous plaire");
|
||||
System.out.println(m.toString());
|
||||
|
||||
System.out.println("On peut afficher en itérant avec forEach (une méthode proposée par Iterable, regardez la doc)");
|
||||
m.forEach(b -> System.out.println(b));
|
||||
|
||||
System.out.println("On a découplé la navigation de la structuration en implémentant iterable plutôt que iterator. On peut maintenant naviguer 2 fois facilement, c'est vraiment trop fort.");
|
||||
m.forEach(b -> System.out.println(b));
|
||||
|
||||
System.out.println("On peut même utiliser les boucles avancées de Java 8 et notre code en devient presque pythonesque");
|
||||
for(Base b: m){
|
||||
System.out.println(b);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,71 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
/**
|
||||
MonBrin code un brin d'ADN sous forme de liste simplement chaînée.
|
||||
|
||||
Plusieurs instances de MonMaillon reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
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<Base> 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<Base>{
|
||||
|
||||
|
||||
public MonBrin(MonMaillon p){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getDebut(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
/** Pour naviguer?
|
||||
On implémente l'interface iterator de java.util ici
|
||||
L'avantage c'est que c'est standard et tout le monde comprendra sans trop de mal comment la navigation fonctionne.
|
||||
**//*
|
||||
@Override
|
||||
public Iterator<Base> iterator() {
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
public class MonBrin implements Iterable<Base> {
|
||||
private MonMaillon debut;
|
||||
|
||||
// Constructeur pour initialiser le brin avec le premier maillon
|
||||
public MonBrin(MonMaillon p) {
|
||||
this.debut = p;
|
||||
}
|
||||
|
||||
// Retourne le premier maillon du brin
|
||||
public MonMaillon getDebut() {
|
||||
return this.debut;
|
||||
}
|
||||
|
||||
// Fournit un itérateur pour parcourir le brin d'ADN
|
||||
@Override
|
||||
public Iterator<Base> iterator() {
|
||||
return new MonBrinIterator(this.debut); // Navigation déléguée à MonBrinIterator
|
||||
}
|
||||
|
||||
// Méthode toString pour afficher tout le brin d'ADN sous forme de chaîne
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
MonMaillon temp = this.debut;
|
||||
while (temp != null) {
|
||||
sb.append(temp.getBase()).append(" ");
|
||||
temp = temp.getSuiteMaillon();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,59 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
MonBrinIterator
|
||||
|
||||
gère la navigation dans un Brin d'ADN
|
||||
|
||||
*/
|
||||
/*
|
||||
public class MonBrinIterator implements Iterator<Base> {
|
||||
|
||||
public MonBrinIterator(MonMaillon m){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
/** Pour naviguer?
|
||||
On implémente l'interface iterable de java.util ici
|
||||
L'avantage c'est que c'est standard et tout le monde comprendra sans trop de mal comment la navogation fonctionne.
|
||||
**//*
|
||||
@Override
|
||||
public boolean hasNext(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Base next() {
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class MonBrinIterator implements Iterator<Base> {
|
||||
private MonMaillon courant;
|
||||
|
||||
// Initialise l'itérateur avec le premier maillon du brin
|
||||
public MonBrinIterator(MonMaillon m) {
|
||||
this.courant = m;
|
||||
}
|
||||
|
||||
// Vérifie s'il y a un élément suivant dans le brin
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return courant != null;
|
||||
}
|
||||
|
||||
// Retourne la base actuelle et passe au maillon suivant
|
||||
@Override
|
||||
public Base next() {
|
||||
if (!hasNext()) throw new NoSuchElementException("No more elements in the iterator.");
|
||||
Base baseActuelle = courant.getBase();
|
||||
courant = courant.getSuiteMaillon(); // Passe au maillon suivant
|
||||
return baseActuelle;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
MonMaillon code un maillon d'un brin d'ADN.
|
||||
plusieurs instances reliées convenablement forment une structure de liste simplement chaînée contenant pour chaque maillon le nom de la base.
|
||||
On n'utilise pas java.util et on recode tout.
|
||||
|
||||
*/
|
||||
/*
|
||||
public class MonMaillon {
|
||||
|
||||
//Le constructeur de base retourne un brin à une base;
|
||||
public MonMaillon(Base b){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
// Le constructeur évolué ajoute une base à un brin.
|
||||
public MonMaillon(Base b, MonMaillon l){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public Base getBase(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public MonMaillon getSuiteMaillon(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
public class MonMaillon {
|
||||
private Base base;
|
||||
private MonMaillon suivant;
|
||||
|
||||
// Constructeur pour un maillon unique
|
||||
public MonMaillon(Base b) {
|
||||
this.base = b;
|
||||
this.suivant = null;
|
||||
}
|
||||
|
||||
// Constructeur pour ajouter un maillon à une chaîne existante
|
||||
public MonMaillon(Base b, MonMaillon l) {
|
||||
this.base = b;
|
||||
this.suivant = l;
|
||||
}
|
||||
|
||||
// Retourne la base de ce maillon
|
||||
public Base getBase() {
|
||||
return this.base;
|
||||
}
|
||||
|
||||
// Retourne le maillon suivant dans le brin
|
||||
public MonMaillon getSuiteMaillon() {
|
||||
return this.suivant;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,58 @@
|
||||
// Fichier Exemple pour le dernier exercice sur l'ADN (Iterable)
|
||||
|
||||
public class Exemple{
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
// codon GCT code l'analine https://en.wikipedia.org/wiki/DNA_codon_table
|
||||
// codon CAT code Histidine
|
||||
// codon CGT code Arginine
|
||||
// codon GCC code Analine
|
||||
// stop codon TAG, voir https://en.wikipedia.org/wiki/Stop_codon
|
||||
|
||||
System.out.println("construction du brin CGT CAT CGT GCC CAT GCT TAG");
|
||||
MonBrin l = new MonBrin(Base.G);
|
||||
l = new MonBrin(Base.A,l);
|
||||
l = new MonBrin(Base.T,l);
|
||||
//
|
||||
l = new MonBrin(Base.T,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
l = new MonBrin(Base.G,l);
|
||||
//
|
||||
l = new MonBrin(Base.T,l);
|
||||
l = new MonBrin(Base.A,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
//
|
||||
l = new MonBrin(Base.C,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
l = new MonBrin(Base.G,l);
|
||||
//
|
||||
l = new MonBrin(Base.T,l);
|
||||
l = new MonBrin(Base.G,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
//
|
||||
l = new MonBrin(Base.T,l);
|
||||
l = new MonBrin(Base.A,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
//
|
||||
l = new MonBrin(Base.T,l);
|
||||
l = new MonBrin(Base.G,l);
|
||||
l = new MonBrin(Base.C,l);
|
||||
//
|
||||
|
||||
System.out.println("l'affichage par défaut ne va toujours pas vous plaire");
|
||||
System.out.println(l.toString());
|
||||
|
||||
System.out.println("On peut afficher en itérant avec forEach (une méthode proposée par Iterable, regardez la doc)");
|
||||
l.forEach(b -> System.out.println(b));
|
||||
|
||||
System.out.println("On a découplé la navigation de la structuration en implémentant iterable plutôt que iterator. On peut maintenant naviguer 2 fois facilement, c'est vraiment trop fort.");
|
||||
l.forEach(b -> System.out.println(b));
|
||||
|
||||
System.out.println("On peut même utiliser les boucles avancées de Java 8 et notre code en devient presque pythonesque");
|
||||
for(Base b: l){
|
||||
System.out.println(b);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,106 @@
|
||||
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<Base> 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<Base> {
|
||||
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<Base> 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();
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
MonBrinIterator
|
||||
|
||||
gère la navigation dans un Brin d'ADN
|
||||
|
||||
*/
|
||||
|
||||
public class MonBrinIterator implements Iterator<Base> {
|
||||
private final MonBrin brin;
|
||||
private int currentIndex;
|
||||
|
||||
public MonBrinIterator(MonBrin brin) {
|
||||
this.brin = brin;
|
||||
this.currentIndex = 0; // Initialise l'index à 0 pour commencer depuis le début
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return currentIndex < brin.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Base next() {
|
||||
if (!hasNext()) {
|
||||
throw new NoSuchElementException("Plus de bases dans le brin");
|
||||
}
|
||||
return brin.getBase(currentIndex++);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
Les biologistes sont des gens étranges pour lesquels les string n'ont que 4 lettres : A,C,G ou T.
|
||||
Ils ne connaissent pas les String, ils parlent d'ADN.
|
||||
|
||||
|
||||
Le Brin est une succession de Maillons.
|
||||
Il suffit de connaître le premier maillon pour définir un brin d'ADN.
|
||||
|
||||
+----------+
|
||||
| maillon |
|
||||
| | _____ next __> autre Maillon
|
||||
| |
|
||||
+----+-----+
|
||||
|
|
||||
| val
|
||||
\|/
|
||||
+----------+
|
||||
| Base |
|
||||
| A |
|
||||
| |
|
||||
+----+-----+
|
||||
Binary file not shown.
Reference in New Issue
Block a user