<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="source.xsl" type="text/xsl"?>
<article xmlns:dc="http://purl.org/dc/elements/1.1">
  <dc:title>Word Spy</dc:title>
  <dc:description>Outil de recherche de mots avec dictionnaire du Scrabble 8</dc:description>
  <dc:creator>Jean-Frédéric Guilbault</dc:creator>
  <dc:subject>Recherche de mots</dc:subject>
  <para type="filename">“WS_Agent.java”</para>
  <para/>
  <para type="import">import java.util.ArrayList;</para>
  <para/>
  <para type="class">public class WS_Agent {</para>
  <para>        private ArrayList&lt;String&gt; list;</para>
  <para>        private String regex;</para>
  <para>        private int letters = 0;</para>
  <para/>
  <para type="function">        public WS_Agent () {</para>
  <para>                list = new ArrayList&lt;String&gt;();</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void SetRegex (String s) {regex = s;}</para>
  <para type="function">        protected void SetLetters (int i) {letters = i;}</para>
  <para type="function">        protected int GetLetters () {return letters;}</para>
  <para type="function">        protected ArrayList&lt;String&gt; GetList () {return list;}</para>
  <para/>
  <para type="comment">        // option - 1= débutant par</para>
  <para type="comment">        // 2= terminant par</para>
  <para type="comment">        // 3= avec joker (longueur fixée) </para>
  <para type="comment">        // note : regex doit être connu</para>
  <para type="function">        protected void FilterList (int option) {</para>
  <para>                ArrayList&lt;String&gt; filtered = new ArrayList&lt;String&gt;();</para>
  <para/>
  <para>                switch(option) {</para>
  <para>                        case 1 :   for(String s : list) </para>
  <para>                                              if(VerifyWord(s, 0)) AddWord(s, filtered);</para>
  <para>                                        break;</para>
  <para>                        case 2 :   for(String s : list) </para>
  <para>                                              if(VerifyWord(s, 1)) AddWord(s, filtered);</para>
  <para>                                        break;</para>
  <para>                        case 3 :   FilterWithJoker();</para>
  <para>                                        break;</para>
  <para>                        default :  break;</para>
  <para>                }</para>
  <para>                if(option == 1 || option == 2) {</para>
  <para>                        list.clear();</para>
  <para>                        for(String s : filtered) AddWord(s, list);</para>
  <para>                }</para>
  <para>                RemoveDuplicates();</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private void FilterWithJoker () {</para>
  <para>                int count;</para>
  <para>                boolean ok = true;</para>
  <para>                ArrayList&lt;String&gt; filtered = new ArrayList&lt;String&gt;();</para>
  <para/>
  <para>                for(String s : list) {</para>
  <para>                        count = 0;</para>
  <para>                        while(count &lt; regex.length() &amp;&amp; ok == true) {</para>
  <para>                                if(regex.charAt(count) == '.') {count++;continue;}</para>
  <para>                                if(regex.toLowerCase().charAt(count) == s.toLowerCase().charAt(count)) ok = true;</para>
  <para>                                else ok = false;</para>
  <para>                                count++;</para>
  <para>                        }</para>
  <para>                        if(ok) AddWord(s, filtered);</para>
  <para>                        else ok = true; </para>
  <para>                }</para>
  <para type="comment">                // ici filtered est ok</para>
  <para>                list.clear();</para>
  <para>                for(String s : filtered) AddWord(s, list);</para>
  <para type="function">        }</para>
  <para/>
  <para type="comment">        // option - 0: débute par </para>
  <para type="comment">        // 1: termine par</para>
  <para type="function">        private boolean VerifyWord (String s, int option) {</para>
  <para>                boolean ok = false;</para>
  <para>                switch(option) {</para>
  <para>                        case 0:   if(s.regionMatches(true, 0, regex, 0, regex.length())) ok = true;</para>
  <para>                                      else ok = false;</para>
  <para>                                      break;</para>
  <para>                        case 1:   if(s.regionMatches(true, (s.length()-regex.length()), regex, 0, regex.length())) ok = true;</para>
  <para>                                      else ok = false;</para>
  <para>                                      break;</para>
  <para>                }</para>
  <para>                return ok;</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void AddWord (String s, ArrayList&lt;String&gt; l) {</para>
  <para>                l.add(s); </para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void DisplayList () {</para>
  <para>                for(String s : list) System.out.println(s);</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private void RemoveDuplicates () {</para>
  <para>                ArrayList&lt;String&gt; temp = new ArrayList&lt;String&gt;();</para>
  <para>                for(String s : list) </para>
  <para>                        if(!Exists(s, temp)) AddWord(s, temp);</para>
  <para>                list.clear();</para>
  <para>                for(String s : temp) AddWord(s, list);</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private boolean Exists (String s, ArrayList&lt;String&gt; l) {</para>
  <para>                for(String d : l) </para>
  <para>                        if(d.equals(s)) return true;</para>
  <para>                return false;</para>
  <para type="function">        }</para>
  <para type="class">}</para>
  <para/>
  <para/>
  <para/>
  <para type="filename">“WS_Library.java”</para>
  <para/>
  <para type="import">import java.io.*;</para>
  <para/>
  <para type="class">public class WS_Library {</para>
  <para type="function">        public WS_Library () {}</para>
  <para/>
  <para type="function">        protected String[] BuildWordListFromFile (int letters) {</para>
  <para>                String text = "";</para>
  <para>                if(letters == 2) text = MergeTexts(text, "./lib/WS_2.txt");</para>
  <para>                else if(letters == 3) text = MergeTexts(text, "./lib/WS_3.txt");</para>
  <para>                else if(letters == 4) text = MergeTexts(text, "./lib/WS_4.txt");</para>
  <para>                else if(letters == 5) text = MergeTexts(text, "./lib/WS_5.txt");</para>
  <para>                else if(letters == 6) text = MergeTexts(text, "./lib/WS_6.txt");</para>
  <para>                else if(letters == 7) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_7A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_7B.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 8) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_8A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_8B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_8C.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 9) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_9A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_9B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_9C.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 10) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_10A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_10B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_10C.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_10D.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 11) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_11A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_11B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_11C.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_11D.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 12) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_12A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_12B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_12C.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 13) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_13A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_13B.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_13C.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 14) {</para>
  <para>                        text = MergeTexts(text, "./lib/WS_14A.txt");</para>
  <para>                        text += MergeTexts(text, "./lib/WS_14B.txt");</para>
  <para>                }</para>
  <para>                else if(letters == 15) text = MergeTexts(text, "./lib/WS_15.txt");</para>
  <para>                else if(letters == 16) text = MergeTexts(text, "./lib/WS_16.txt");</para>
  <para>                else if(letters == 17) text = MergeTexts(text, "./lib/WS_17.txt");</para>
  <para>                else if(letters == 18) text = MergeTexts(text, "./lib/WS_18.txt");</para>
  <para>                else if(letters == 19) text = MergeTexts(text, "./lib/WS_19.txt");</para>
  <para>                else if(letters == 20) text = MergeTexts(text, "./lib/WS_20.txt");</para>
  <para>                else if(letters == 21) text = MergeTexts(text, "./lib/WS_21.txt");</para>
  <para/>
  <para>                String[] list = text.split("\s");</para>
  <para>                return list;</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private String MergeTexts (String text, String filename) {</para>
  <para>                try {</para>
  <para>                        String line = "";</para>
  <para>                        FileReader fr = new FileReader(filename);</para>
  <para>                        BufferedReader buf = new BufferedReader(fr);</para>
  <para>                        do{</para>
  <para>                                line = buf.readLine();</para>
  <para>                                if(line != null) text += line + "\s";</para>
  <para>                        } while(line != null);</para>
  <para/>
  <para>                        buf.close();</para>
  <para>                        fr.close();</para>
  <para>                }</para>
  <para>                catch(IOException e) {System.out.println(e.getMessage());}</para>
  <para/>
  <para>                return text;</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void ConvertToArrList (String[] list, WS_Agent spy) {</para>
  <para>                for(int i = 0 ; i &lt; list.length ; i++) spy.AddWord(list[i], spy.GetList());</para>
  <para type="function">        }</para>
  <para type="class">}</para>
  <para/>
  <para/>
  <para/>
  <para type="filename">“WS_Setup.java”</para>
  <para/>
  <para type="import">import java.util.Scanner;</para>
  <para/>
  <para type="class">public class WS_Setup {</para>
  <para>        private Scanner scan;</para>
  <para>        private WS_Library lib;</para>
  <para>        private String[] tab;</para>
  <para/>
  <para type="function">        public WS_Setup () {</para>
  <para>                lib = new WS_Library();</para>
  <para>                scan = new Scanner(System.in); </para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void SetRegex (WS_Agent spy) {</para>
  <para>                String temp;</para>
  <para>                System.out.print("Chercher (JOKER : . ) : ");</para>
  <para>                temp = scan.nextLine();</para>
  <para>                spy.SetRegex(temp);</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void SetLetterCount (WS_Agent spy, int num) {</para>
  <para>                spy.SetLetters(num);</para>
  <para type="function">        }</para>
  <para/>
  <para type="comment">        // choice1 - 1= recherche par longueur de mot</para>
  <para type="comment">        // 2= recherche tous les mots</para>
  <para type="comment">        // choice2 - 1= débutant par</para>
  <para type="comment">        // 2= terminant par</para>
  <para type="comment">        // 3= avec joker (longueur fixée)</para>
  <para type="function">        protected void GetWordList (int choice1, int choice2, WS_Agent spy) {</para>
  <para type="comment">                // recherche par longueur de mot</para>
  <para>                if(choice1 == 1) {</para>
  <para>                        MakeUpList(spy);</para>
  <para>                        switch(choice2) {</para>
  <para>                                case 1:   spy.FilterList(1);</para>
  <para>                                              break;</para>
  <para>                                case 2:   spy.FilterList(2);</para>
  <para>                                              break;</para>
  <para>                                case 3:   spy.FilterList(3);</para>
  <para>                                              break;</para>
  <para>                                default:	  break;</para>
  <para>                        }</para>
  <para>                }</para>
  <para type="comment">                // recherche tous les mots</para>
  <para>                else if(choice1 == 2){</para>
  <para>                        MakeUpALL(spy);</para>
  <para>                        switch(choice2) {</para>
  <para>                                case 1:   spy.FilterList(1);</para>
  <para>                                              break;</para>
  <para>                                case 2:   spy.FilterList(2);</para>
  <para>                                              break;        </para>
  <para>                                default:  break;</para>
  <para>                        }</para>
  <para>                }</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private void MakeUpList (WS_Agent spy) {</para>
  <para>                tab = lib.BuildWordListFromFile(spy.GetLetters());</para>
  <para>                lib.ConvertToArrList(tab, spy);</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private void MakeUpALL (WS_Agent spy) {</para>
  <para>                tab = lib.BuildWordListFromFile(2);</para>
  <para>                lib.ConvertToArrList(tab, spy);</para>
  <para>                for(int i = 3 ; i &lt; 22 ; i++) {</para>
  <para>                        tab = lib.BuildWordListFromFile(i);</para>
  <para>                        ComposeWordLists(tab, spy);</para>
  <para>                }</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected void ComposeWordLists (String[] tab, WS_Agent spy) {</para>
  <para>                for(int i = 0 ; i &lt; tab.length ; i++) spy.AddWord(tab[i], spy.GetList());</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        protected String[] BuildStringArray (String s) {</para>
  <para>                return s.split("\s");</para>
  <para type="function">        }</para>
  <para type="class">}</para>
  <para/>
  <para/>
  <para/>
  <para type="filename">“WS.java”</para>
  <para/>
  <para type="import">import java.util.Scanner;</para>
  <para/>
  <para type="class">public final class WS {</para>
  <para>        private static Scanner scan;</para>
  <para>        private static WS_Setup ws;</para>
  <para>        private static WS_Agent spy;</para>
  <para/>
  <para type="function">        public static void main (String[] args) {</para>
  <para>                ws = new WS_Setup();</para>
  <para>                scan = new Scanner(System.in);</para>
  <para>                int choice1 = 0, choice2 = 0;</para>
  <para>                spy = new WS_Agent();</para>
  <para/>
  <para>                while(true) {</para>
  <para type="comment">                        // section collecte d'entrées utilisateur</para>
  <para>                        choice1 = MainMenu();</para>
  <para>                        if(choice1 == 1 || choice1 == 2) choice2 = SubMenu1();</para>
  <para>                        if(choice2 &gt;= 1 &amp;&amp; choice2 &lt; 4) {</para>
  <para>                                switch(choice2) {</para>
  <para>                                        case 1:   System.out.print("Mot débutant par : ");</para>
  <para>                                                      break;</para>
  <para>                                        case 2:   System.out.print("Mot terminant par : ");</para>
  <para>                                                      break;</para>
  <para type="comment">                                        // utilisé seulement pour "par longueur de mot"</para>
  <para>                                        case 3:   System.out.print("Positions avec joker (.) : ");</para>
  <para>                                                      break;</para>
  <para>                                        default:  System.out.println("Mauvais choix");</para>
  <para>                                                      break;</para>
  <para>                                }</para>
  <para type="comment">                                // input de la chaîne à rechercher</para>
  <para>                                ws.SetRegex(spy);</para>
  <para>                        }</para>
  <para type="comment">                        // choice1 - 1= recherche par longueur de mot</para>
  <para type="comment">                        // 2= recherche tous les mots</para>
  <para type="comment">                        // choice2 - 1= débutant par</para>
  <para type="comment">                        // 2= terminant par</para>
  <para type="comment">                        // 3= avec joker (longueur fixée)</para>
  <para type="comment">                        // section recherche selon options choisies</para>
  <para>                        if(choice1 == 1) {</para>
  <para>                                ws.GetWordList(choice1, choice2, spy);</para>
  <para>                                System.out.println();</para>
  <para>                                spy.DisplayList();</para>
  <para>                                System.out.println(spy.GetList().size() + " mots trouvés\n");</para>
  <para>                        }</para>
  <para>                        else if(choice1 == 2) {</para>
  <para>                                ws.GetWordList(choice1, choice2, spy);</para>
  <para>                                spy.DisplayList();</para>
  <para>                        }</para>
  <para>                }</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private static int MainMenu () {</para>
  <para type="comment">                // effacer écran</para>
  <para>                System.out.println("1. Rechercher par longueur de mot");</para>
  <para>                System.out.println("2. Rechercher tous les mots");</para>
  <para>                System.out.println("3. Quitter");</para>
  <para>                System.out.print("\t--&gt; Choix : ");</para>
  <para>                int choice;</para>
  <para>                choice = scan.nextInt();</para>
  <para>                scan.nextLine();</para>
  <para/>
  <para>                if(choice == 1) {</para>
  <para>                        System.out.print("Nombre de lettres : ");</para>
  <para>                        int i = scan.nextInt();</para>
  <para>                        scan.nextLine();</para>
  <para>                        System.out.println("\nletters --&gt; " + i);</para>
  <para>                        ws.SetLetterCount(spy, i);</para>
  <para>                }</para>
  <para>                else if(choice == 3) System.exit(0);</para>
  <para>                return choice;</para>
  <para type="function">        }</para>
  <para/>
  <para type="function">        private static int SubMenu1 () {</para>
  <para type="comment">                // effacer écran</para>
  <para>                System.out.println("1. Mots débutant par [ ]");</para>
  <para>                System.out.println("2. Mots terminant par [ ]");</para>
  <para>                System.out.println("3. Positions variées (joker : . (point)");</para>
  <para>                System.out.println("4. Menu principal\n\n");</para>
  <para>                System.out.print("\t--&gt; Choix : ");</para>
  <para/>
  <para>                int choice = scan.nextInt();</para>
  <para>                scan.nextLine();</para>
  <para/>
  <para>                return choice;</para>
  <para type="function">        }</para>
  <para type="class">}</para>
</article>
