Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

ArrayList – un vector mai bun!

   ArrayList este o colectie simpla care poate stoca orice tip de obiect.

   Clasa ArrayList este continuta in spatiul de nume System.Collections. Aceasta clasa ne permite sa construim un vector care sa creasca in marime, adaugand mereu elemente noi.

   La declarare nu trebuie sa ii specificam marimea, fiind suficient doar :

    //declare
    ArrayList lista = new ArrayList();

    //Folosind metoda Add adugam obiecte, indiferent de tipul lor.

//adaugam obiecte lista.Add("String"); lista.Add(3); lista.Add(5.65); //folosim iteratia pentru //parcurgerea listei foreach (object o in lista) { Console.WriteLine(o); } //proprietatea count //pentru a afla numarul de elemente //din lista Console.WriteLine("Lista are {0} obiecte", lista.Count);

   Daca incercam o iteratie astfel, va fi aruncata o exceptie :

    foreach (string s in lista)
    {
        Console.WriteLine(s);
    }
Unable to cast object of type 'System.Int32' to type 'System.String'.

   Construim o lista de tip string si vom folosi metoda Sort pentru a o sorta alfabetic si Reverse pentru sortare inversa

    ArrayList listaString = new ArrayList();
    listaString.Add("def");
    listaString.Add("ghi ");
    listaString.Add("abc");
    listaString.Add("xyz");
    listaString.Add(" ");
    
    //sortare in ordine alfabetica
    listaString.Sort();
    foreach (object o in listaString)
    {
        //convertim in string
        Console.WriteLine(o.ToString());
    }

    Console.WriteLine("----");
    //sortare in ordine inversa
    listaString.Reverse();
    foreach (object o in listaString)
    {
        Console.WriteLine(o.ToString());
    }

Folosim metoda Remove pentru a sterge un obiect din lista.

    //sterge un obiect 
    //din lista
    lista.Remove("abc");

Pentru localizarea unui anumit element, apelam metoda BinarySearch si transmitem valoarea obiectului pentru a fi returnata pozitia obiectului in lista.

    Console.WriteLine(listaString.BinarySearch("def"));

Putem folosi si metoda Contains care va returna o valoare de tip boolean ( daca lista contine sau nu contine elementul cautat).

    Console.WriteLine(listaString.Contains("def"));

ArrayList si Array se aseamana foarte mult. Ambele permit stocarea unui numar mare de elemente.

ArrayList cu referinte

Vom crea o clasa Cont, cu 3 metode. Apoi vom construi obiecte pe baza ei si vom adauga referinte in ArrayList catre obiectele respective.

 
    class Cont
    {
        private decimal sold = 0;
        //scade o suma din sold
        public bool RetrageSuma(decimal suma)
        {
            //daca nu sunt suficienti bani

            if (suma > sold)
            {
                return false;
            }
            else
            {
                sold = sold - suma;
                return true;
            }
        }

        //adauga suma la debit
        public void Depune(decimal suma)
        {
            sold = sold + suma;
        }
        //afiseaza soldul
        public decimal Sold()
        {
            return sold;
        }
    }

In Main:

    //initial putem dam un parametru
    //dar poate pastra mai multe
    //sau mai putine elemente
    ArrayList conturi = new ArrayList(10);
            
    //creem instante ale clasei cont
    Cont student = new Cont();
    Cont elev = new Cont();
           
    //adaugam referinte
    conturi.Add(student);
    conturi.Add(elev);

   Observatie : nu adaugam un Cont in lista, ci doar facem ca un element din lista sa indice catre un Cont. Deci, nu se adauga obiectul insusi, ci o referinta.

   Cum accesem elementele ? Daca incercam astfel, cum suntem obisnuiti, vom avea eroare la compilare :

    Cont c = conturi[0];
    c.Sold();

Cannot implicitly convert type ‘object’ to ‘ContExemplu.Cont’. An explicit conversion exists (are you missing a cast?)

   Motivul este ca ArrayList este o lista de Objects. Vom rezolva problema convertind la tipul Cont.

    //facem conversie la Cont
    Cont c = (Cont)conturi[0];
    Console.WriteLine(c.Sold());

   O lista cu membrii ArrayList se gaseste pe msdn.

   Foarte asemanatoare cu ArrayList este clasa List, in plus avand avantajul de typesafe. Vom scrie despre aceasta clasa in articolul viitor.Exista si StringCollection, o colectie tipizata. Impreuna cu alte colectii din .Net care sunt strongly typed, aceste clase tipizate sunt usor de folosit in dezvoltare datorita faptului ca Visual Studio poate face automat validarea si nu mai e nevoie sa folosim conversia.

Codul folosit in exemplele anterioare:

Category: Uncategorized
  • Timotei Dolean says:

    Mie nu-mi prea place ArrayList-ul ca nu e typesafe. Daca tot se vrea a fi folosit mai bine sa fie folosit DOAR pentru item-uri de tip referinta.

    February 11, 2010 at 10:18 pm
  • zeltera says:

    Macar e mai bun decat…. array!

    February 11, 2010 at 11:16 pm
  • irina says:

    cum se rezolva problema cu sortarea alfabetica atunci cand se preia de la utilizator vectorul de stringuri? //Microsoft.VisualBasic.Interaction.Inputbox

    January 10, 2013 at 10:38 am
  • zeltera says:

    Nu stiu la ce te referi cand spui “vectorul de stringuri”, insa daca o colectie de obiecte (strings, in cazul tau), poti folosi obiecte din namespaceul collection pentru a face sortarea.

    Nu am folosit Microsoft.VisualBasic.Interaction.Inputbox – nu prea am folosit VisualBasic – si nu stiu ce obtii de la acest control, insa daca obtii o colectie de strngs poti pune aceasta colectie intr-un obiect de tip ArrayList si folosi merodele de sortare din ArrayList.

    Daca ai pune un exemplu ar fi mai usor sa raspund.

    January 10, 2013 at 11:13 am

Your email address will not be published. Required fields are marked *

*