15 Decembre
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
// juste un type énuméré pour nommer les bases
|
||||
public enum Base {
|
||||
A,C,G,T
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,83 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
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> {
|
||||
|
||||
/**
|
||||
C'est le constructeur de base (pun intended) qui construit un brin à une base
|
||||
|
||||
@param b : la base
|
||||
|
||||
Ici je pourrais mettre un commentaire plus long sur le fonctionement détaillé de mon super constructeur.
|
||||
|
||||
*/
|
||||
public MonBrin(Base b){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
C'est le constructeur évolué qui construit un brin en ajoutant la base donnée en argument devant le brin donné en argument.
|
||||
|
||||
@param b : la base qui va aller devant
|
||||
@param l : le brin qui sera à la suite
|
||||
|
||||
NB. Ce constructeur est un peu obsolète avec la nouvelle structure interne.
|
||||
On devrait en ajouter un qui prend en paramètre un tableau de bases.
|
||||
*/
|
||||
public MonBrin(Base b, MonBrin 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 int length(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public int limit(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public int capacity(){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public Base getBase(int i){
|
||||
throw new UnsupportedOperationException("cette méthode n'est pas implémentée");
|
||||
}
|
||||
|
||||
public Base[] getBases(){
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@@ -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> {
|
||||
|
||||
//Le constructeur de base retourne un brin à une base;
|
||||
public MonBrinIterator(MonBrin brin){
|
||||
}
|
||||
|
||||
/** 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 navigation 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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user