Le but de ce TP sera d'utiliser les collections java pour résoudre un problème concret de différentes manières et de voir qu'en utilisant des collections différentes on pourra avoir le même résultat mais qu'au niveau performance il y aura des différentes clairement visibles.

On cherche à travailler sur l'ensemble des mots en Français, voici une liste des mots à télécharger : ici

Avec cette liste des mots du Français, on souhaite pouvoir chercher efficacement si un mot est présent dans la liste.

Pour cela, on va utiliser les différentes collections Java pour répondre à cette question.

 

Partie 1 : Liste

Commencons tout d'abord par une liste. Vous devez réaliser la classe  ListOfWords qui fonctionnera avec le code suivant :

import java.util.ArrayList;

public class App {
    public static void main(String[] args) throws Exception {
        int nbElements=10000;

        ListOfWords lWords=new ListOfWords();
        ArrayList<String> l= lWords.randomSelect(nbElements);
        for(String s : l){
            //System.out.println(s);
        }
        long start=System.currentTimeMillis();
        ArrayList<String> lfound = lWords.find(l);
        long end=System.currentTimeMillis();
        long timeElapsed = end - start;
        
        for(String s : lfound){
            //System.out.println(s);
        }
        System.out.println("time with List "+timeElapsed);
   }
}

Le constructueur de ListOfWords doit lire le fichier des mots et mettre les mots dans une liste.

La méthode randomSelect sélectionne aléatoirement nbElements mots et les retourne dans un liste.

La méthode find prend une liste de mots en entrée et retourne une autre liste qui contient les mêmes mots suivis de "yes" ou de "no" selon que le mot est dans la liste de ListOfWords ou non.

 

Partie 2 : Table de hachage

Ensuite on va créer une classe HashOfWords pour réaliser la même tâche. Ainsi on va utiliser une table de hachage avec du type HashMap<Integer,String>. Pour calculer la clé, on utilisera la fonction hashCode() sur un String.

 

Le code sera le suivant :

import java.util.ArrayList;

public class App {
    public static void main(String[] args) throws Exception {
        int nbElements=10000;

        ListOfWords lWords=new ListOfWords();
        ArrayList<String> l= lWords.randomSelect(nbElements);
        for(String s : l){
            //System.out.println(s);
        }
        long start=System.currentTimeMillis();
        ArrayList<String> lfound = lWords.find(l);
        long end=System.currentTimeMillis();
        long timeElapsed = end - start;
        
        for(String s : lfound){
            //System.out.println(s);
        }
        System.out.println("time with List "+timeElapsed);


        HashOfWords hWords=new HashOfWords();
        
        start=System.currentTimeMillis();
        lfound = hWords.findValuesList(l);
        end=System.currentTimeMillis();
        timeElapsed = end - start;
        System.out.println("time with HashMap values List "+timeElapsed);


        start=System.currentTimeMillis();
        lfound = hWords.findValuesToSet(l);
        end=System.currentTimeMillis();
        timeElapsed = end - start;
        System.out.println("time with HashMap values converted to Set "+timeElapsed);


        start=System.currentTimeMillis();
        lfound = hWords.findKeys(l);
        end=System.currentTimeMillis();
        timeElapsed = end - start;
        /*for(String s : lfound){
            System.out.println(s);
        }*/
        System.out.println("time with HashMap keys "+timeElapsed);


    }

}

 

Pour chercher si les mots sont présents dans la tache de hachage, on va écrire 3 méthodes différentes.

La méthode findValuesList() va utiliser simplement containsValue.
La méthode findValuesToSet() va utiliser la méthode values() d'un HashMap et on mettra le résultat dans un HashSet de String avant d'utiliser la méthode contains sur le HashSet.
La méthode findKeys() va utiliser la méthode containsKey() avec en paramètre la chaine de caractère sur laquelle on aura calculé la valeur hachée (avec hashCode()).
 

Partie 3 : Comparaison des versions des tables de hachage

On va tester les 3 types de table de hachage de Java avec le code suivant.

Vous devez modifier légèrement votre code pour executer le code. La valeur nbElements=100000 est mise pour pouvoir constater une différence au niveau de l'exécution du code. Vous pouvez la changer.

 

import java.util.ArrayList;

public class App {
    public static void main(String[] args) throws Exception {
        int nbElements=100000;

        ListOfWords lWords=new ListOfWords();
        ArrayList<String> l= lWords.randomSelect(nbElements);
        for(String s : l){
            //System.out.println(s);
        }
        long start=System.currentTimeMillis();
        ArrayList<String> lfound = lWords.find(l);
        long end=System.currentTimeMillis();
        long timeElapsed = end - start;
        
        for(String s : lfound){
            //System.out.println(s);
        }
        System.out.println("time with List "+timeElapsed);


        for (int i=0;i<3;i++) {


            HashOfWords hWords=new HashOfWords(i);
            switch(i) {
                case 0: System.out.println("HashMap"); break;
                case 1: System.out.println("TreeMap"); break;
                case 2: System.out.println("LinkedHashMap"); break;
            }

            start=System.currentTimeMillis();
            lfound = hWords.findValuesList(l);
            end=System.currentTimeMillis();
            timeElapsed = end - start;
            System.out.println("time with HashMap values List "+timeElapsed);


            start=System.currentTimeMillis();
            lfound = hWords.findValuesToSet(l);
            end=System.currentTimeMillis();
            timeElapsed = end - start;
            System.out.println("time with HashMap values converted to Set "+timeElapsed);


            start=System.currentTimeMillis();
            lfound = hWords.findKeys(l);
            end=System.currentTimeMillis();
            timeElapsed = end - start;
            /*for(String s : lfound){
                System.out.println(s);
            }*/
            System.out.println("time with HashMap keys "+timeElapsed);
        }

    }

}