Interfata List
O lista reprezinta o colectie ordonata de elemente. Intr-o lista sunt permise elementele duplicate. Permite un control mult mai precis asupra pozitiei unui element prin intermediul indexului acelui element.
Interfata List descrie liste de elemente indexate. Pe langa metodele mostenite din interfata Collection, interfata List ofera metode pentru acces pozitional, cautare si iterare avansata.
public interface List<E> extends Collection<E> { | |
int size(); | |
boolean isEmpty(); | |
boolean contains(Object o); | |
Iterator<E> iterator(); | |
Object[] toArray(); | |
<T> T[] toArray(T[] a); | |
boolean add(E e); | |
boolean remove(Object o); | |
boolean containsAll(Collection<?> c); | |
boolean addAll(Collection<? extends E> c); | |
boolean addAll(int index, Collection<? extends E> c); | |
boolean removeAll(Collection<?> c); | |
boolean retainAll(Collection<?> c); | |
void clear(); | |
boolean equals(Object o); | |
int hashCode(); | |
E get(int index); | |
E set(int index, E element); | |
void add(int index, E element); | |
E remove(int index); | |
int indexOf(Object o); | |
int lastIndexOf(Object o); | |
ListIterator<E> listIterator(); | |
ListIterator<E> listIterator(int index); | |
List<E> subList(int fromIndex, int toIndex); | |
} |
In afara metodelor preluate din Collection, interfata List introduce metode pentru adaugarea si stergerea unui element in functie de un index sau pentru obtinerea unui element de la o anumita pozitie.
Metoda | Semnificatie |
---|---|
boolean addAll(int index, Collection<? extends E> c) | adauga in lista elementele colectiei transmise, incepand cu pozitia index |
E get(int index) | returneaza elementul de la pozitia index |
E set(int index, E element) | modifica elementul de la pozitia index |
add(int index, E element) | adauga un element la pozitia index |
E remove(int index) | sterge elementul de la pozitia index |
int indexOf(Object o) | returneaza indexul corespunzator primei aparitii a elementului in lista sau -1 daca lista nu contine elementul transmis |
int lastIndexOf(Object o) | returneaza indexul corespunzator ultimei aparitii a elementului in lista sau -1 daca lista nu contine elementul transmis |
ListIterator listIterator() | returneaza un iterator de tip ListIterator pentru elementele listei |
ListIterator listIterator(int index) | returneaza un iterator de tip ListIterator pentru elementele listei, incepand cu pozitia index |
List<E> subList(int fromIndex, int toIndex) | returneaza o sublista a elementelor dintr-o lista incepand cu pozitia fromIndex (inclusiv) si terminand cu pozitia toIndex (exclusiv) |
Implementari standard
Pentru interfata List sunt disponibile si urmatoarele doua implementari standard:
• ArrayList: permite acces aleator la elementele listei; obtinearea oricarui element din lista se va face in timp constant; in schimb, adaugarea sau stergerea unui element in interiorul listei necesita deplasarea elementelor care se gasesc dupa pozitia la care se executa operatia;
package ro.virtualcampus.list; | |
import java.util.ArrayList; | |
public class AppArrayList { | |
public static void main(String[] args) { | |
int tablou[] = { 5, 1, 3, 4, 6, 1, 7 }; | |
ArrayList<Integer> lista = new ArrayList<Integer>(); | |
for (int i = 0; i < tablou.length; i++) { | |
lista.add(Integer.valueOf(tablou[i])); | |
} | |
lista.add(1, 2); | |
System.out.println(lista); | |
System.out.printf("numarul de elemente din lista %s este %d %n", lista, lista.size()); | |
System.out.printf("indexul primei aparitii a elementului %d in lista %s este %d %n", | |
1, lista, lista.indexOf(1)); | |
System.out.printf("indexul ultimei aparitii a elementului %d in lista %s este %d %n", | |
1, lista, lista.lastIndexOf(1)); | |
lista.add(Integer.valueOf(8)); | |
lista.set(2, Integer.valueOf(2)); | |
System.out.println(lista); | |
System.out.printf("elementul de pe ultima pozitie (%d) in lista %s este %d %n", | |
lista.size() - 1, lista, lista.get(lista.size() - 1)); | |
lista.remove(lista.size() - 1); | |
System.out.printf("parcurgere elemente lista folosind for %n"); | |
for (int i = 0; i < lista.size(); i++) { | |
Integer element = lista.get(i); | |
int intVal = element.intValue(); | |
System.out.printf("%d, ", intVal); | |
} | |
System.out.printf("%n"); | |
System.out.printf("parcurgere elemente lista folosind for-each %n"); | |
for (Integer element : lista) { | |
int intVal = element.intValue(); | |
System.out.printf("%d, ", intVal); | |
} | |
} | |
} |
[5, 2, 1, 3, 4, 6, 1, 7] numarul de elemente din lista [5, 2, 1, 3, 4, 6, 1, 7] este 8 indexul primei aparitii a elementului 1 in lista [5, 2, 1, 3, 4, 6, 1, 7] este 2 indexul ultimei aparitii a elementului 1 in lista [5, 2, 1, 3, 4, 6, 1, 7] este 6 [5, 2, 2, 3, 4, 6, 1, 7, 8] elementul de pe ultima pozitie (8) in lista [5, 2, 2, 3, 4, 6, 1, 7, 8] este 8 parcurgere elemente lista folosind for 5, 2, 2, 3, 4, 6, 1, 7, parcurgere elemente lista folosind for-each 5, 2, 2, 3, 4, 6, 1, 7,
• LinkedList: ofera timp constant pentru operatii de adaugare sau stergere; in schimb, ofera doar acces secvential la elementele listei; de exemplu, pentru a obtine un element al listei care este pozitionat in mijlocul acesteia este necesar un timp proportional cu dimensiunea listei.
package ro.virtualcampus.list; | |
import java.util.ArrayList; | |
import java.util.Collections; | |
import java.util.LinkedList; | |
import java.util.List; | |
public class AppLinkedList { | |
public static void main(String args[]) { | |
int tablou[] = { 5, 1, 3, 4, 6, 1, 7 }; | |
ArrayList<Integer> lista1 = new ArrayList<Integer>(); | |
for (int i = 0; i < tablou.length; i++) { | |
lista1.add(Integer.valueOf(tablou[i])); | |
} | |
System.out.println(lista1); | |
LinkedList<Integer> lista2 = new LinkedList<Integer>(lista1); | |
System.out.println(lista2); | |
lista2.addFirst(6); | |
System.out.printf("elementul de pe prima pozitie din lista %s este %d %n", | |
lista2, lista2.getFirst()); | |
lista2.removeFirst(); | |
lista2.addLast(5); | |
System.out.printf("elementul de pe ultima pozitie din lista %s este %d %n", | |
lista2, lista2.getLast()); | |
lista2.removeLast(); | |
List<Integer> lista3 = lista2.subList(3, 7); | |
System.out.printf("sublista %s din lista %s %n", lista3, lista2); | |
Collections.sort(lista3); | |
System.out.printf("sublista ordonata este %s %n", lista3); | |
Collections.reverse(lista3); | |
System.out.printf("sublista ordonata invers este %s %n", lista3); | |
} | |
} |
[5, 1, 3, 4, 6, 1, 7] [5, 1, 3, 4, 6, 1, 7] elementul de pe prima pozitie din lista [6, 5, 1, 3, 4, 6, 1, 7] este 6 elementul de pe ultima pozitie din lista [5, 1, 3, 4, 6, 1, 7, 5] este 5 sublista [4, 6, 1, 7] din lista [5, 1, 3, 4, 6, 1, 7] sublista ordonata este [1, 4, 6, 7] sublista ordonata invers este [7, 6, 4, 1]
In plus, fata de metodele din interfata List, clasa LinkedList adauga o serie de metode care permit manipularea elementelor pozitionate la inceputul, respectiv sfarsitul listei.
Metoda | Semnificatie |
---|---|
E getFirst() | returneaza primul element din lista |
E getLast() | returneaza ultimul element din lista |
E removeFirst() | sterge si returneaza primul element din lista |
E removeLast() | sterge si returneaza ultimul element din list |
void addFirst(E e) | adauga un element la inceputul listei |
void addLast(E e) | adauga un element la finalul listei |
Parcurgerea listelor
Parcurgerea elementelor unei liste poate fi realizata cu ajutorul constructiei for-each si prin intermediul iteratorilor.
Constructia for-each permite parcurgerea rapida a elementelor unei liste cu ajutorul unei iteratii de tip for. Urmatoarea secventa de cod utilizeaza o constructie for-each pentru a afisa elementele unei liste.
package ro.virtualcampus.list; | |
import java.util.List; | |
import java.util.Arrays; | |
public class AppListForEach { | |
public static void main(String args[]) { | |
String nume[] = {"Ioana", "Ghita", "Maria"}; | |
List<String> lista = Arrays.asList(nume); | |
for (String element : lista) | |
System.out.println(element); | |
} | |
} |
Ioana Ghita Maria
Iteratorii reprezinta structuri de date suplimentare care permit parcurgerea elementelor unei liste. Iteratorii sunt obiecte care pot realiza traversarea in ordine a unei liste la care sunt atasati. Ordinea de parcurgere a elementelor este determinata de modul in care acestea sunt retinute in interiorul listei.
Declararea unui iterator se realizeaza prin urmatoarea sintaxa:
Iterator<E> iteratorLista = lista.iterator();
Interfata Iterator prezinta urmatoarea structura:
public interface Iterator { boolean hasNext(); E next(); void remove(); }
Metoda | Semnificatie |
---|---|
boolena hasNext() | returneaza true daca mai exista elemente neparcurse inca prin intermediul iteratorului |
E next() | returneaza urmatorul element din colectie |
void remove() | elimina din colectie ultimul element returnat de metoda next() |
package ro.virtualcampus.list; | |
import java.util.ArrayList; | |
import java.util.Iterator; | |
import java.util.List; | |
public class AppListIterator { | |
public static void main(String[] args) { | |
String[] nume = {"Ioana", "Ghita", "Maria"}; | |
List lista = new ArrayList(); | |
for (String element : nume) | |
lista.add(element); | |
Iterator<String> i = lista.iterator(); | |
while (i.hasNext()) | |
System.out.println(i.next()); | |
} | |
} |
Ioana Ghita Maria
Din exemplul precedent se poate observa ca parcurgerea unei liste cu ajutorul unui iterator se face astfel:
while(iteratorLista.hasNext()) iteratorlista.next();
Structurile de tip List ofera un iterator suplimentar, specializat, numit ListIterator, cu urmatoarea structura:
public interface ListIterator extends Iterator { | |
boolean hasNext(); | |
E next(); | |
boolean hasPrevious(); | |
E previous(); | |
int nextIndex(); | |
int previousIndex(); | |
void remove(); | |
void set(E e); | |
void add(E e); | |
} |
Acest iterator permite atat parcurgerea listei in ambele directii, cat si modificarea ei prin metodele remove(), set(E e) si add(E e).