tout marche sauf le dernier
This commit is contained in:
BIN
TP4/stub/0Bad/Base.class
Normal file
BIN
TP4/stub/0Bad/Base.class
Normal file
Binary file not shown.
4
TP4/stub/0Bad/Base.java
Normal file
4
TP4/stub/0Bad/Base.java
Normal file
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
BIN
TP4/stub/0Bad/Exemple.class
Normal file
BIN
TP4/stub/0Bad/Exemple.class
Normal file
Binary file not shown.
31
TP4/stub/0Bad/Exemple.java
Normal file
31
TP4/stub/0Bad/Exemple.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/0Bad/MonBrin.class
Normal file
BIN
TP4/stub/0Bad/MonBrin.class
Normal file
Binary file not shown.
68
TP4/stub/0Bad/MonBrin.java
Normal file
68
TP4/stub/0Bad/MonBrin.java
Normal file
@@ -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
|
||||
|
||||
}
|
||||
*/
|
||||
BIN
TP4/stub/0Bad/MonMaillon.class
Normal file
BIN
TP4/stub/0Bad/MonMaillon.class
Normal file
Binary file not shown.
57
TP4/stub/0Bad/MonMaillon.java
Normal file
57
TP4/stub/0Bad/MonMaillon.java
Normal file
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
BIN
TP4/stub/1Iterable/Base.class
Normal file
BIN
TP4/stub/1Iterable/Base.class
Normal file
Binary file not shown.
4
TP4/stub/1Iterable/Base.java
Normal file
4
TP4/stub/1Iterable/Base.java
Normal file
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
BIN
TP4/stub/1Iterable/Exemple.class
Normal file
BIN
TP4/stub/1Iterable/Exemple.class
Normal file
Binary file not shown.
34
TP4/stub/1Iterable/Exemple.java
Normal file
34
TP4/stub/1Iterable/Exemple.java
Normal file
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
BIN
TP4/stub/1Iterable/MonBrin.class
Normal file
BIN
TP4/stub/1Iterable/MonBrin.class
Normal file
Binary file not shown.
90
TP4/stub/1Iterable/MonBrin.java
Normal file
90
TP4/stub/1Iterable/MonBrin.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/1Iterable/MonMaillon.class
Normal file
BIN
TP4/stub/1Iterable/MonMaillon.class
Normal file
Binary file not shown.
51
TP4/stub/1Iterable/MonMaillon.java
Normal file
51
TP4/stub/1Iterable/MonMaillon.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/2Iterator/Base.class
Normal file
BIN
TP4/stub/2Iterator/Base.class
Normal file
Binary file not shown.
4
TP4/stub/2Iterator/Base.java
Normal file
4
TP4/stub/2Iterator/Base.java
Normal file
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
BIN
TP4/stub/2Iterator/Exemple.class
Normal file
BIN
TP4/stub/2Iterator/Exemple.class
Normal file
Binary file not shown.
35
TP4/stub/2Iterator/Exemple.java
Normal file
35
TP4/stub/2Iterator/Exemple.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
BIN
TP4/stub/2Iterator/MonBrin.class
Normal file
BIN
TP4/stub/2Iterator/MonBrin.class
Normal file
Binary file not shown.
71
TP4/stub/2Iterator/MonBrin.java
Normal file
71
TP4/stub/2Iterator/MonBrin.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/2Iterator/MonBrinIterator.class
Normal file
BIN
TP4/stub/2Iterator/MonBrinIterator.class
Normal file
Binary file not shown.
59
TP4/stub/2Iterator/MonBrinIterator.java
Normal file
59
TP4/stub/2Iterator/MonBrinIterator.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/2Iterator/MonMaillon.class
Normal file
BIN
TP4/stub/2Iterator/MonMaillon.class
Normal file
Binary file not shown.
56
TP4/stub/2Iterator/MonMaillon.java
Normal file
56
TP4/stub/2Iterator/MonMaillon.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/3IteratorDifferentInnerStructure/Base.class
Normal file
BIN
TP4/stub/3IteratorDifferentInnerStructure/Base.class
Normal file
Binary file not shown.
4
TP4/stub/3IteratorDifferentInnerStructure/Base.java
Normal file
4
TP4/stub/3IteratorDifferentInnerStructure/Base.java
Normal file
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
||||
BIN
TP4/stub/3IteratorDifferentInnerStructure/Exemple.class
Normal file
BIN
TP4/stub/3IteratorDifferentInnerStructure/Exemple.class
Normal file
Binary file not shown.
58
TP4/stub/3IteratorDifferentInnerStructure/Exemple.java
Normal file
58
TP4/stub/3IteratorDifferentInnerStructure/Exemple.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
BIN
TP4/stub/3IteratorDifferentInnerStructure/MonBrin.class
Normal file
BIN
TP4/stub/3IteratorDifferentInnerStructure/MonBrin.class
Normal file
Binary file not shown.
106
TP4/stub/3IteratorDifferentInnerStructure/MonBrin.java
Normal file
106
TP4/stub/3IteratorDifferentInnerStructure/MonBrin.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
BIN
TP4/stub/3IteratorDifferentInnerStructure/MonBrinIterator.class
Normal file
BIN
TP4/stub/3IteratorDifferentInnerStructure/MonBrinIterator.class
Normal file
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++);
|
||||
}
|
||||
}
|
||||
|
||||
20
TP4/stub/explication.txt
Normal file
20
TP4/stub/explication.txt
Normal file
@@ -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 |
|
||||
| |
|
||||
+----+-----+
|
||||
Reference in New Issue
Block a user