ArrayList

Java pune la dispoziție o clasă din pachetul java.util care, spre deosebire de array-ul classic, își poate modifica dinamic dimensiunea. Elementele dintr-un ArrayList sunt indexate asemenea unui array, fiind 0-based. Într-un ArrayList se pot adăuga elemente, sau scoate, fără a fi nevoie să creăm un ArrayList nou.

Spre deosebire de array, ArrayList poate conține numai obiecte, nu și primitive.

Un ArrayList nu poate retine tipuri de date primite. Daca vrem sa salvam numere, caractere sau alte tipuri primitive in acesta, pentru fiecare avem o clasa analoaga de tip wrapper: Integer, Character, Double, etc.

Pentru a putea retine valori intr-un ArrayList, putem folosi si sintaxa de tip generic.

ArrayList<Integer> lista = new ArrayList<Integer>(); // s-a creat un ArrayList care nu are nici un element.
lista.size(); // returnează numărul de elemente. În acest caz =0.

Metode uzuale

//adaugarea de elemente
lista.add(15);  //pe poziția 0
lista.add(40);   //pe pozitia 1
lista.add(80);   // pe pozitia 2
lista.add(22);    //pe pozitia 3

// adauga un element la un anumit index
lista.set(3, 64);

//vizualizarea unui anumit element, pe baza indexului:
System.out.println(lista.get(3));   // elementul de pe pozitia 3

//vizualizarea tuturor elementelor:
System.out.println(lista);

//șterge toate elementele din listă
lista.clear();

ArrayList<String> lista = new ArrayList<String>(); // se pot adauga doar elemente de tip String

// Obtinerea unui element de pe o anumita pozitie:
String comp = lista.get(4);

// returnarea primei pozitii în care se găsește un element
int index = lista.indexOf(sir1);

// returnarea ultimei pozitii in care se gaseste un element
int index = lista.lastIndexOf(sir1);

// verifica daca un element dat se gaseste in lista
System.out.println(lista.contains(sir1));

//stergerea unui element
String stringDeLaIndex3 = lista.remove(3); // sterge elementul de pe pozitia 3 din ArrayList și îl returnează
boolean amSters = lista.remove(sir1); // sterge prima aparitie a elementului sir1 daca exista si returneaza true sau false

Exerciţii

Se considera mai multe avioane reprezentate sub forma de String.

1. Creați o listă (ArrrayList) de avioane folosind variabile pe stack.

Solutie

Solutie

ArrayList<String> avioane = new ArrayList();

String avionBoeing = "Boeing";
String avionAirbus = "Airbus";
String avionConcorde = "Concorde";
String avionIAR = "IAR";
String avionCessna = "Cessna";
String avionLockheed = "Lockheed";

avioane.add(avionBoeing);
avioane.add(avionAirbus);
avioane.add(avionConcorde);
avioane.add(avionIAR);
avioane.add(avionCessna);
avioane.add(avionLockheed);


2. Afișați avionul de pe indexul 3.

Solutie

Solutie

System.out.println(avioane.get(3));


3. Înlocuiţi un avion cu altul nou.

Solutie

Solutie

String avionNou = "Spitfire";
avioane.set(3, avionNou);   // sau avioane.set(3, "Spitfire");
System.out.println(avioane.get(3));


4. Verificați dacă lista de avioane conține un anumit avion.

Solutie

Solutie

System.out.println("avioane contine Cessna? " + avioane.contains(avionCessna) );
System.out.println("avioane contine Cessna? " + avioane.contains("Cessna") );
System.out.println("avioane contine Mustang? " + avioane.contains("Mustang") );


5. Afișați indexul unui avion.

Solutie

Solutie

System.out.println("Index Lockheed = " + avioane.indexOf(avionLockheed));


6. Ștergeți un avion după index.

Solutie

Solutie

avioane.remove(5);
System.out.println("Mai exista Lockheed? " + avioane.contains(avionLockheed));


7. Ştergeți un avion.

Solutie

Solutie

avioane.remove(avionCessna);
System.out.println("Mai exista Cessna? " + avioane.contains("Cessna") );


Iterare

Un ArrayList se poate itera în cu o buclă for sau o buclă for-each.

Exemple:

for classic:

for (int i = 0; i<lista.size(); i++){
	if (lista.get(i).getMarca().equals(“Acer”)){
		lista.remove(i);
	}
}

for-each:

for (Computer computer : lista) {
	if (computer.getMarca().equals(“Toshiba”)){
		lista.remove(computer);
	}
}

Exerciţii

1. Creaţi un ArrayList care reţine valori de tipul Integer. Adăugaţi în acesta 10 copii ale numărului -113. Afişaţi conţinutul acestuia pe ecran.

Nu folosiţi o buclă şi nici o variabilă pentru index. Va trebui să vă folosiţi de numere literali pentru a face referire la fiecare poziţie.

Solutie

Solutie

ArrayList<Integer> valori = new ArrayList<>();

valori.add(-113);

// aici se face autoboxing - acel int este convertit la Integer de catre compilator
// pentru a adauga direct un obiect Integer, se putea folosi una dintre variantele:
// valori.add(new Integer(-113)) 
// valori.add(Integer.valueOf(-113))

valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);
valori.add(-113);

System.out.println(valori.get(0));    // aici are loc este conversia inversa, unboxing
System.out.println(valori.get(1));
System.out.println(valori.get(2));
System.out.println(valori.get(3));
System.out.println(valori.get(4));
System.out.println(valori.get(5));
System.out.println(valori.get(6));
System.out.println(valori.get(7));
System.out.println(valori.get(8));
System.out.println(valori.get(9));


2. Creaţi un ArrayList care reţine valori de tipul Integer. Adăugaţi în acesta 10 copii ale numărului -113 şi afişaţi conţinutul acestuia pe ecran.

De data aceasta, folosiţi o buclă pentru a umple array-ul cu valori şi apoi pentru a-l afişa. De asemenea, în condiţia de la buclă, nu număraţi până la un număr literal, ci va trebui să folosiţi metoda size() din ArrayList.

Solutie

Solutie

ArrayList<Integer> valori = new ArrayList<>();

for (int i = 0; i < 10; i++) {
   valori.add(-113);   
}

for (int i = 0; i < valori.size(); i++) {
   System.out.println(valori.get(i));
}


3. Creaţi un ArrayList care să reţină valori de tipul Integer. Adăugaţi în acesta 10 numere aleatoare, cu valori între 1 şi 100. Apoi afişaţi conţinutul acestui ArrayList. Folosiţi o buclă pentru a genera valori. Pentru afişare puteţi folosi metodă simplă, fără buclă:

System.out.println("ArrayList: " + whateverYourArrayListVariableIsCalled);

4. Creaţi un ArrayList care să reţină valori de tipul Integer. Populaţi lista cu 1,000 de valori aleatoare, fiecare între 10 şi 99. Apoi afişaţi conţinutul acestui ArrayList pe ecran cu o modalitate preferată.

5. Copierea unui ArrayList.

Scrieţi un program care să creeze un ArrayList ce conţine valori de tipul Integer. Puneţi 10 numere aleatoare în acesta între 1 şi 100. Acesta ar trebui să copieze toate elementele din primul ArrayList într-un alt ArrayList de aceeaşi dimensiune. Afişaţi apoi valorile din cei doi ArrayList folosind modalitatea dorită.

Solutie

Solutie

ArrayList<Integer> valori = new ArrayList<>();

for (int i = 0; i < 10; i++) {
   valori.add( (int)(Math.random()*99+1)  );   
}

System.out.println("Afisam ArrayListul initial:\n" + valori);

// varianta cu constructor
ArrayList<Integer> valoriCopiateConstructor = new ArrayList<>(valori);

System.out.println("\nAfisam ArrayListul nou creat prin constructor");
for (Integer i : valoriCopiateConstructor) {
   System.out.print(i + ", ");   // unboxing
}
System.out.println();

// varianta manuala
ArrayList<Integer> valoriCopiateManual = new ArrayList<>();

for (Integer i : valori) {
   valoriCopiateManual.add(i);
}

System.out.println("\nAfisam ArrayListul copiat manual:\n" + valoriCopiateManual);


6. Căutarea unei valori într-un ArrayList.

Creaţi un ArrayList care reţine valori de tipul Integer şi populaţi-l cu valori aleatoare între 1 şi 50. Afişaţi aceste valori pe ecran, apoi cereţi utilizatorului să introducă un număr întreg. Apoi căutaţi în ArrayList numărul introdus:

  • dacă numărul se află în listă, afişaţi un mesaj; dacă găsiţi de mai multe ori numărul respectiv, nu este nicio problemă dacă mesajul va fi afişat de mai multe ori.
  • nu afişaţi un mesaj dacă valoarea nu a fost găsită.

Solutie

Solutie

ArrayList<Integer> valori = new ArrayList<>();
      
// populare
for (int i = 0; i < 20; i++) {
   valori.add( (int)(Math.random()*50+1)  );   
}

System.out.println(valori);

Scanner keyboard = new Scanner(System.in);
System.out.println("Introduceti un numar intre 1 si 50:");
int nrCautat = keyboard.nextInt();

// cautare valori
for (int i = 0; i<valori.size(); i++) {
   if (valori.get(i) == nrCautat) {
      System.out.println("Numarul a fost gasit");
   }

}


Discussion

, 2017/01/31 10:37

In the exercise Nr 6.

Would it be better to check if the ArrayList contains the number we are looking for before starting to look at every element of the arrayList with the for statement?

		if (valori.contains(nrCautat)){
			for (int i ..
		}

Is the contains method of arrayList more efficient than the for|enhanced for? Or it doesn't make a difference?

, 2017/02/01 09:27

The purpose of the exercise is to create an algorithm which finds a number in an ArrayList. You can just use the "contains" method or others and it will automatically find it for you.

You could leave a comment if you were logged in.