Exemplo n.º 1
0
        public string Codeer(string input, ListBox freqLijst)
        {
            // 1. verwerk de input letter voor letter en verhoog de betreffende index in (array) charCount
            // ...
            foreach (char c in input)
            {
                charCount[c].count++;
            }

            foreach (var c in charCount.Where(x => x.count > 0).OrderByDescending(x => x.count).ThenBy(x => x.character))
            {
                freqLijst.Items.Add(c.character + " : " + c.count);
            }

            // 2. sorteer het array d.m.v. binary sort (de sorteer functie kan je hergebruiken uit een vorige opdracht)
            // ...
            charCount = charCount.OrderByDescending(x => x.count).ThenBy(x => x.character).ToArray();

            // 3. maak voor alle relevante klassen in charCount knopen aan met als userObject de betreffende charCount
            // en plaats deze in een nieuw ArrayList (een ArrayList kun je dynamisch verkleinen, dat straks nodig is)
            //ArrayList knopen = new ArrayList();
            List <Knoop> knopen = new List <Knoop>();

            // ...
            foreach (CharCount c in charCount.Where(x => x.count > 0))
            {
                knopen.Add(new Knoop(c));
            }

            // 4. herhaal nu (zolang de gesorteerde ArrayList met knopen groter is dan 1):
            //  maak een nieuwe knoop die de 2 knopen met laagste count als kinderen heeft en
            //  deze 2 knopen vervolgens vervangt in de array(list) (de letter 0 als char, de som van de counts als count)
            //  zorg er voor dat deze vervangende knoop op de juiste positie komt in de array en
            // dat de array 1 item kleiner wordt
            // ...
            //List<Knoop> knopen = new List<Knoop>();
            int charsLeft = knopen.Count - 1;

            while (charsLeft > 0)
            {
                Knoop knoop  = new Knoop(new CharCount('0'));
                var   knoop1 = (knopen[charsLeft] as Knoop);
                //knoop1.userObject.binaireWaarde += "0";
                var knoop2 = (knopen[charsLeft - 1] as Knoop);
                //knoop2.userObject.binaireWaarde += "1";

                knoop.userObject.count = knoop1.userObject.count + knoop2.userObject.count;

                knoop.AddKnoopLinks(knoop2);
                knoop.AddKnoopRechts(knoop1);
                knopen[charsLeft] = knoop;

                knopen.Remove(knoop2);

                knopen.OrderByDescending(x => x.userObject.count).ThenBy(x => x.userObject.character);

                //tmpKnopen.Sort();
                //tmpKnopen = (tmpKnopen as List<Knoop>).OrderBy(x => (x as Knoop).userObject.count);
                charsLeft = charsLeft - 1;
            }

            // 5.
            // geef nu alle blaadjes in de boom (van het type Knoop dus) hun bijbehorende binaire waarde
            // dit kan je doen een recursieve methode te maken die als parameter de "huidige" binaire waarde heeft en hier
            // aan de linker-aanroep een extra "0" toevoegt en aan de rechter-aanroep een extra "1"
            //zijn zowel de linkerkant als de rechterkant null, dan zit je in een blaadje en kan de huidige waarde worden toegekend

            Knoop tree = (Knoop)knopen[0];

            GetBinaryValue(tree, string.Empty);
            // ...

            // de tree is nu afgerond
            this.boom = tree;

            // 6. maak een loop over alle characters in input
            // hierbij kan je gebruik maken van de enumerator "IDictionaryEnumerator GetEnumerator" van de tree
            // zoek de knoop die hoort bij het huidige character
            // voeg de binaire waarde van de knoop toe aan een output string
            string outputStr = "";
            // ...
            var    searcher = tree.GetEnumerator();
            string code     = string.Empty;

            foreach (char c in input)
            {
                while (searcher.MoveNext())
                {
                    var charCount = (CharCount)searcher.Value;
                    if (charCount.character == c)
                    {
                        outputStr += charCount.binaireWaarde;
                        code       = charCount.binaireWaarde;
                        break;
                    }
                }
                searcher = tree.GetEnumerator();
                Debug.WriteLine("Found char: " + c + " With binary: " + code + " OutputString is: " + outputStr);
            }
            // 7. loop over alle knopen in de tree
            // voeg aan de freqlijst.Items nieuwe items toe in het format: "count x character"
            // ...

            // return de output string
            return(outputStr);
        }
Exemplo n.º 2
0
        public string Codeer(string input, ListBox freqLijst)
        {
            // Skip without input
            if (input.Equals(String.Empty))
            {
                return("");
            }

            Reset();

            // 1. verwerk de input letter voor letter en verhoog de betreffende index in (array) charCount
            foreach (char c in input)
            {
                charCount[c].count++;
            }

            // 2. sorteer het array d.m.v. binary sort (de sorteer functie kan je hergebruiken uit een vorige opdracht) -
            // dit werkt door de IComparable interface
            Array.Sort(charCount);

            // 3. maak voor alle relevante klassen in charCount knopen aan met als userObject de betreffende charCount
            // en plaats deze in een nieuw ArrayList (een ArrayList kun je dynamisch verkleinen, dat straks nodig is)
            ArrayList knopen = new ArrayList();

            for (int c = 0; c < MAXCHAR; c++)
            {
                if (charCount[c].count == 0)
                {
                    continue;
                }

                knopen.Add(new Knoop(charCount[c]));
            }

            // 4. herhaal nu (zolang de gesorteerde ArrayList met knopen groter is dan 1):
            while (knopen.Count > 1)
            {
                //  maak een nieuwe knoop die de 2 knopen met laagste count als kinderen heeft en
                //  deze 2 knopen vervolgens vervangt in de array(list) (de letter 0 als char, de som van de counts als count)
                Knoop[] laagsteKnopen = new Knoop[2];
                laagsteKnopen[0] = (Knoop)knopen[0];
                laagsteKnopen[1] = (Knoop)knopen[1];
                Array.Sort(laagsteKnopen);

                CharCount newCharCount = new CharCount('0');
                newCharCount.count = laagsteKnopen[0].userObject.count + laagsteKnopen[1].userObject.count;

                Knoop newKnoop = new Knoop(newCharCount);
                newKnoop.links  = laagsteKnopen[0];
                newKnoop.rechts = laagsteKnopen[1];

                //  zorg er voor dat deze vervangende knoop op de juiste positie komt in de array en
                // dat de array 1 item kleiner wordt
                knopen.Remove(laagsteKnopen[0]);
                knopen.Remove(laagsteKnopen[1]);
                knopen.Add(newKnoop);

                // Sort zet alles weer op de goede plek
                knopen.Sort();
            }

            // 5.
            // geef nu alle blaadjes in de boom (van het type Knoop dus) hun bijbehorende binaire waarde
            // dit kan je doen een recursieve methode te maken die als parameter de "huidige" binaire waarde heeft en hier
            // aan de linker-aanroep een extra "0" toevoegt en aan de rechter-aanroep een extra "1"
            tree = (Knoop)knopen[knopen.Count - 1];
            SetBinary(tree, "");

            // de tree is nu afgerond


            string outputStr = "";

            // 6. maak een loop over alle characters in input
            foreach (char character in input)
            {
                KnoopIterator iterator = (KnoopIterator)tree.GetEnumerator();

                // zoek de knoop die hoort bij het huidige character
                while (iterator.MoveNext())
                {
                    CharCount charCount = (CharCount)iterator.Value;

                    // voeg de binaire waarde van de knoop toe aan een output string en exit de while -> volgende character
                    if (charCount.character.Equals(character))
                    {
                        outputStr += charCount.binaireWaarde;
                        break;
                    }
                }
            }

            // 7. loop over alle knopen in de tree
            KnoopIterator knoopIterator = (KnoopIterator)tree.GetEnumerator();

            while (knoopIterator.MoveNext())
            {
                CharCount charCount = (CharCount)knoopIterator.Value;

                // voeg aan de freqlijst.Items nieuwe items toe in het format: "count x character"
                if (!charCount.character.Equals('0'))
                {
                    freqLijst.Items.Add(charCount.count + " x " + charCount.character);
                }
            }

            // return de output string
            return(outputStr);
        }