– Cześć, Amigo.
– Hej, Raszi.
– Baśka powiedziała mi, że potrzebujesz więcej przykładów z kolekcjami. Dam Ci zatem kilka. Tutaj jest lista kolekcji i interfejsów:
Interfejs | Klasa/implementacja | Opis |
---|---|---|
List | ArrayList | List |
LinkedList | List | |
Wektor | Wektor | |
Stos | Stos | |
Set | HashSet | Set |
TreeSet | Set | |
SortedSet | Sortowany set | |
Map | HashMap | Map/słownik |
TreeMap | Map/słownik | |
SortedMap | Sortowany słownik | |
Hashtable | Hash-table (pl. tablica mieszająca) |
– Hmm. Sporo tego. Cztery Listy, trzy Sety i cztery Mapy.
– Tak, wszystkie one są innymi implementacjami interfejsów List, Set i Map.
– Jaka jest różnica między tymi implementacjami?
– To dokładnie to, o czym będziemy dzisiaj rozmawiać. Bądź cierpliwy.
– Czy masz jeszcze jakieś pytania?
– Wiem, jak wyświetlić listę na ekranie. Jak wyświetlić Set albo Map?
– Elementy w List są uporządkowane, więc możesz użyć indeksu, aby je wyświetlić. Set i Map nie mają konkretnego porządku. W zasadzie, porządek ich elementów może ulec zmianie, kiedy nowe pozycje zostaną dodane lub usunięte.
– Niesamowite.
– To dlatego powstały specjalne obiekty nazywane iteratorami, by móc pracować z elementami kolekcji. Pozwalają Ci przejść przez wszystkie elementy w kolekcji, nawet jeśli mają jedynie nazwy zamiast wskaźników (Map) lub nie mają ani nazw, ani wskaźników (Set).
– Oto kilka przykładów:
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Deszczyk");
set.add("w");
set.add("Hiszpanii");
// Deklaruje iterator dla setu
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) // Sprawdza istnienie kolejnego elementu
{
// Sprawdza bieżący element i przechodzi do następnego
String tekst = iterator.next();
System.out.println(tekst);
}
}
public static void main(String[] args)
{
List<String> lista = new ArrayList<String>();
lista.add("Deszczyk");
lista.add("w");
lista.add("Hiszpanii");
Iterator<String> iterator = lista.iterator();// // Deklaruje iterator dla listy
while (iterator.hasNext()) // Sprawdza istnienie kolejnego elementu
{
// Sprawdza bieżący element i przechodzi do następnego
String tekst = iterator.next();
System.out.println(tekst);
}
}
public static void main(String[] args)
{
// Wszystkie elementy są przechowywane w parach
Map<String, String> mapa = new HashMap<String, String>();
mapa.put("pierwszy", "deszczyk");
mapa.put("drugi", "w");
mapa.put("trzeci", "Hiszpanii");
Iterator<Map.Entry<String, String>> iterator = mapa.entrySet().iterator();
while (iterator.hasNext())
{
// Sprawdza parę klucz-wartość
Map.Entry<String, String> para = iterator.next();
String klucz = para.getKey(); // Klucz
String wartosc = para.getValue(); // Wartość
System.out.println(klucz + ":" + wartosc);
}
}
– Wow. Zastanawiam się, co to wszystko znaczy.
– Właściwie to dość proste. Najpierw ładujemy z kolekcji specjalny obiekt: iterator. Iterator ma tylko dwie metody.
1. Metoda next() zwraca kolejny element w kolekcji.
2. Metoda hasNext() sprawdza, czy istnieją wciąż elementy, które nie zostały zwrócone przez next().
– OK. Wydaje mi się, że trochę się to rozjaśniło. Pozwól, że powtórzę Ci to, co zrozumiałem.
– Zatem... Najpierw musimy wywołać metodę iterator() na kolekcji, by pobrać ten magiczny obiekt iterator.
– Następnie sprawdzamy wszystkie elementy po kolei tak długo, aż nie zostanie już żaden do sprawdzenia. Pobieramy kolejny element w kolekcji poprzez wywołanie next() i sprawdzamy, czy są wciąż jakieś elementy w kolekcji, wywołując hasNext() na iteratorze. Zgadza się?
– Tak, mniej więcej. Ale zaczekaj na najlepszą część.
– Java posiada skrótową notację do pracy z iteratorami. Podążając za wzorem while i for, dodano kolejne specjalne twierdzenie: for each. Wskazuje na nie również słowo kluczowe for.
– Pętla for-each jest używana jedynie do pracy z kolekcjami i kontenerami. Domyślnie używa ona iteratora, ale widzimy tylko zwracany element.
– Pozwól, że pokażę Ci dłuższy oraz krótszy sposób na pracę z iteratorem:
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Deszczyk");
set.add("w");
set.add("Hiszpanii");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
String tekst = iterator.next();
System.out.println(tekst);
}
}
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Deszczyk");
set.add("w");
set.add("Hiszpanii");
for (String tekst : set)
{
System.out.println(tekst);
}
}
– Zauważ, że słowa podświetlone na czerwono lub zielono są nieobecne w prawej części. W istocie trzy linie są zastąpione przez jedną.
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
String tekst = iterator.next();
for (String tekst : set)
– Świetnie to wygląda. Ten sposób bardziej mi się podoba.
– Spójrzmy na skróconą wersję powyższych przykładów:
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Deszczyk");
set.add("w");
set.add("Hiszpanii");
for (String tekst : set)
{
System.out.println(tekst);
}
}
public static void main(String[] args)
{
List<String> lista = new ArrayList<String>();
lista.add("Deszczyk");
lista.add("w");
lista.add("Hiszpanii");
for (String tekst : lista)
{
System.out.println(tekst);
}
}
public static void main(String[] args)
{
Map<String, String> mapa = new HashMap<String, String>();
mapa.put("pierwszy", "deszczyk");
mapa.put("drugi", "w");
mapa.put("trzeci", "Hiszpanii");
for (Map.Entry<String, String> para : mapa.entrySet())
{
String klucz = para.getKey(); // Klucz
String wartosc = para.getValue(); // Wartość
System.out.println(klucz + ":" + wartosc);
}
}
– Teraz to rozumiem!
– Cieszę się, że Ci się podoba.
GO TO FULL VERSION