// MODULE: VectorTest.java // AUTEUR: felipe // OBJET: donner une implementation (possible de Vector) // COMMENT: uniquement illustratif, il est inutile de recreer de telles classes // dans un langage comme Java (ou C++) // le type meme de programme que vous devriez pouvoir faire en examen... // (sans les Exceptions et les Enumerations :-) felipe! import java.util.*; // ---------------------------------------------------------------------------- // une classe juste pour verifier si un vector range les references aux objects // ou cree une copie des objets // ---------------------------------------------------------------------------- class Bidon { private static int nb; // nb d'objects de cette classe existants private int data; public Bidon(int val) { // constructeur nb++; data = val; } public int getValue() {return data;} static public int getNbObjects() {return nb;} public String toString() {return "Un objet de la classe Bidon " + data;} public void finalize() { nb--; } } // ----------------------------------------------------------- // juste pour montrer que l'on peut creer son propre objet // Exception // ----------------------------------------------------------- class MyVectorException extends RuntimeException { public MyVectorException() {} public MyVectorException(String s) {super(s);} } // ----------------------------------------------------------- // la classe qui fait ceci EN MIEUX dans Java est Vector ! // en particulier, cette classe en verifie pas grand chose ... // ----------------------------------------------------------- class MyVector { private final boolean debug = false; private boolean isIncrementSet; // to deal how it will grow private int capacity; // nb max d'elts private int elementCount; // nb d'elts presents private int capacityIncrement; // if 0, alors double a chaque resize private Object [] elementData; // la table d'objects // quelques methodes internes private void relocates() { // la nouvelle capacity sera: if (isIncrementSet) capacity += capacityIncrement; else capacity *= 2; if (debug) System.err.println("DEBUG: relocates to " + capacity); Object [] copieData = new Object [capacity]; System.arraycopy(elementData,0,copieData,0,elementCount); elementData = copieData; } private void init() {elementCount = 0;} private void init (int initialCapacity, int capacityIncrement, boolean b) { isIncrementSet = b; this.capacityIncrement = capacityIncrement; elementCount = 0; elementData = new Object [capacity = initialCapacity]; } // les constructeurs public MyVector(int initialCapacity, int capacityIncrement) { init(initialCapacity,capacityIncrement,true); } public MyVector(int initialCapacity) {init(initialCapacity,0,false);} public MyVector() {init(10,0,false);} // -------------------------------------------- // les principales methodes de la classe Vector // il en existe bcp d'autres .... // -------------------------------------------- public int capacity() {return capacity;} public int size() {return elementCount;} public void addElement(Object o) { // ajout en fin if (elementCount >= capacity) relocates(); elementData[elementCount++] = o; } public void add(int index, Object element) throws MyVectorException { if (index >= elementCount) throw new MyVectorException(); if (elementCount >= capacity) relocates(); for (int i= (++elementCount); i>index; i--) // decalage vers la droite elementData[i] = elementData[i-1]; elementData[index] = element; } public void clear() {init();} public boolean contains(Object elem) { for (int i=0; i= elementCount) throw new MyVectorException(); return elementData[index]; } public Object firstElement() throws MyVectorException { if (elementCount == 0) throw new MyVectorException(); return elementData[0]; } public Object lastElement() throws MyVectorException { if (elementCount == 0) throw new MyVectorException(); return elementData[elementCount-1]; } public Object remove(int index) throws MyVectorException { if ((index >= elementCount) || (elementCount == 0)) throw new MyVectorException(); Object ref = elementData[index]; for (int i=index; i= v3.length) { Integer b [] = new Integer[i*2]; System.arraycopy(v3,0,b,0,v3.length); v3 = b; } v3[i] = new Integer(i); } end = new Date().getTime(); System.out.println("Allocation de " + nb + " éléments avec un tableau: " + (end - start) + " ms"); } } /* lokbani>inclure jdk lokbani>javac VectorTest.java lokbani>java VectorTest Taille de départ=10 Je retire Un objet de la classe Bidon 2 Capacité= 20 Taille actuelle= 14 Nbre d'objets Bidon crées= 6 Contient l'objet table[2] ?: true Contient l'objet b ?: false elts: 1 2 3 4 5 1 3 4 5 1 2 3 4 5 Capacité=20 La taille actuelle du vecteur= 0 =========================== Je retire Un objet de la classe Bidon 2 Capacité= 20 Taille actuelle= 14 Nbre d'objets Bidon crées= 6 Contient l'objet table[2] ?: true Contient l'objet b ?: false elts: 1 2 3 4 5 1 3 4 5 1 2 3 4 5 Capacité après un clear= 20 Taille actuelle après un clear= 0 =========================== Allocation de 399999 éléments avec Vector: 1688 ms Allocation de 399999 éléments avec MyVector: 1479 ms Allocation de 399999 éléments avec un tableau: 2398 ms lokbani> */