Java collections

Klasa Collections oferuje kilka wysoce wydajnych algorytmów do modyfikowania elementów kolekcji. Algorytmy (rysunek 16.5) są zaimplementowane jako metody statyczne. Metody sort, binarySearch, reverse, shuffle, fill i copy działają na obiektach interfejsu List. Metody min, max, addAll, frequency i disjoint działają na obiektach interfejsu Collection.

 

Metoda Opis
sort Sortuje elementy obiektu List.
binarySearch Znajduje obiekt w obiekcie List. Wykorzystuje wydajny algorytm
wyszukiwania binarnego
reverse Odwraca elementy obiektu List.
shuffle Losowo układa elementy obiektu List.
fill Ustawia wszystkie elementy obiektu List na wskazany obiekt.
copy Kopiuje referencje z jednej listy do drugiej.
min Zwraca najmniejszy element kolekcji.
max Zwraca największy element kolekcji.
addAll Dodaje wszystkie elementy tablicy do kolekcji.
frequency Oblicza, ile elementów kolekcji jest równych wskazanemu elementowi.
disjoint Określa, czy dwie kolekcje nie mają żadnych wspólnych elementów.

Rysunek 16.5. Niektóre metody klasy Collections

 

Obserwacja z poziomu inżynierii oprogramowania
Metody frameworku kolekcji są polimorficzne. Oznacza to, że mogą działać  na dowolnych obiektach implementujących konkretne interfejsy niezależnie od ich wewnętrznej implementacji.

 

Metoda sort

Metoda sort sortuje elementy obiektu List. Typ elementu musi implementować interfejs Comparable. Kolejność określa porządek naturalny implementowany przez metodę compareTo. Dla liczb porządek naturalny oznacza kolejność rosnącą, a dla tekstów kolejność wynikającą z porządku leksykograficznego. Metodę compareTo deklaruje interfejs Comparable. Jest ona czasem nazywana metodą porównania naturalnego. Wywołanie metody sort może w drugim argumencie wskazać obiekt Comparator określający alternatywy sposób porządkowania elementów.

 

Sortowanie w kolejności rosnącej

Na rysunku 16.6 metoda sort klasy Collections uporządkowuje elementy obiektu List w kolejności rosnącej (wiersz 15.). Wiersz 12. tworzy obiekt List z tekstami i umieszcza go w zmiennej list. Wiersze 13. i 16. używają niejawnego wywołania metody toString zmiennej list, aby wyświetlić w konsoli zawartość listy.

1 // Rysunek 16.6. Sort1.java
2 // Metoda sort klasy Collections
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;

7 public class Sort1 {
8     public static void main(String[] args) {
9         String[] suits = {"Trefl", "Karo", "Kier", "Pik"};
10
11       // Utwórz i wyświetl listę zawierającą elementy tablicy suits
12       List list = Arrays.asList(suits);
13       System.out.printf("Nieposortowane elementy tablicy: %s%n", list);
14
15       Collections.sort(list); // Wywołanie metody sort dla ArrayList
16       System.out.printf("Posortowane elementy tablicy: %s%n", list);
17    }
18 }

Nieposortowane elementy tablicy: [Trefl, Karo, Kier, Pik]
Posortowane elementy tablicy: [Karo, Kier, Pik, Trefl]

Rysunek 16.6. Metoda sort klasy Collections

 

Sortowanie w kolejności malejącej

Na rysunku 16.7 sortowana jest ta sama lista co na rysunku 16.6, ale w kolejności malejącej. Przykład zawiera interfejs Comparator, który pozwala sortować elementy kolekcji inaczej niż domyślnie. Wiersz 16. wywołuje metodę sort klasy Collections, aby posortować elementy listy w kolejności malejącej. Metoda reverseOrder klasy Collections zwraca obiekt Comparator, który porządkuje elementy
w sposób odwrotny od domyślnego. Ponieważ sortowana kolekcja to List, metoda reverseOrder zwraca Comparator.

1 // Rysunek 16.7. Sort2.java
2 // Użycie metody sort z obiektem Comparator
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 public class Sort2 {
8     public static void main(String[] args) {
9         String[] suits = {"Trefl", "Karo", "Kier", "Pik"};
10
11       // Utwórz i wyświetl listę zawierającą elementy tablicy suits
12       List list = Arrays.asList(suits); // Tworzy obiekt List
13       System.out.printf("Nieposortowane elementy tablicy: %s%n", list);
14
15       // Posortuj w odwrotnej kolejności za pomocą obiektu Comparator
16       Collections.sort(list, Collections.reverseOrder());
17       System.out.printf("Posortowane elementy tablicy: %s%n", list);
18    }
19 }

Nieposortowane elementy tablicy: [Trefl, Karo, Kier, Pik]
Posortowane elementy tablicy: [Trefl, Pik, Kier, Karo]

Rysunek 16.7. Użycie metody sort z obiektem Comparator


Sortowanie za pomocą własnego komparatora

Na rysunku 16.8 tworzona jest własna klasa Comparator o nazwie TimeComparator, która implementuje interfejs Comparator na potrzeby porównywania dwóch obiektów Time2. Klasa Time2 zadeklarowana na rysunku 8.5 reprezentuje czas w godzinach,
minutach i sekundach.

1 // Rysunek 16.8. TimeComparator.java
2 // Własna klasa Comparator, która porównuje dwa obiekty Time2
3 import java.util.Comparator;
4
5 public class TimeComparator implements Comparator {
6     @Override
7     public int compare(Time2 time1, Time2 time2) {
8         int hourDifference = time1.getHour() - time2.getHour();
9
10       if (hourDifference != 0) { // Najpierw sprawdź godzinę
11           return hourDifference;
12       }
13
14       int minuteDifference = time1.getMinute() - time2.getMinute();
15
16       if (minuteDifference != 0) { // Następnie sprawdź minuty
17           return minuteDifference;
18       }
19
20       int secondDifference = time1.getSecond() - time2.getSecond();
21       return secondDifference;
22    }
23 }

Rysunek 16.8. Własna klasa Comparator, która porównuje dwa obiekty Time2

Klasa TimeComparator implementuje interfejs Comparator, uogólniony typ, który przyjmuje jeden argument typu (w tym przypadku Time2). Klasa implementująca Comparator musi deklarować metodę compare, która przyjmuje dwa argumenty i zwraca: wartość ujemną, jeśli pierwszy argument jest mniejszy od drugiego; 0, jeśli argumenty są sobie równe; wartość dodatnią, jeśli pierwszy argument jest większy od drugiego. Metoda compare (wiersze od 6. do 22.) porównuje obiekty Time2. Wiersz 8. wylicza różnicę między dwiema godzinami. Jeśli godziny są różne (wiersz 10.), zwracamy tę wartość. Wartość dodatnia oznacza, że pierwsza
godzina jest większa od drugiej, a więc pierwszy czas jest większy od drugiego. Jeśli wartość jest ujemna, pierwsza godzina jest mniejsza od drugiej, więc pierwszy czas jest mniejszy od drugiego. Dla wartości równej zero wykonujemy taki sam test
dla minut (a potem być może dla sekund), aby stwierdzić, który czas jest większy. Na rysunku 16.9 sortujemy listy za pomocą przekazanej klasy TimeComparator implementującej Comparator. Wiersz 9. tworzy obiekt ArrayList z obiektami Time2.
Przypomnijmy, że ArrayList i List to typy uogólnione, które wymagają wskazania typu elementów kolekcji. Wiersze od 11. do 15. tworzą pięć obiektów Time2 i dodają je do listy. Wiersz 21. wywołuje metodę sort, przekazując obiekt klasy TimeComparator (rysunek 16.8).

 

1 // Rysunek 16.9. Sort3.java
2 // Metoda sort klasy Collections używająca niezależnego obiektu Comparator
3 import java.util.List;
4 import java.util.ArrayList;
5 import java.util.Collections;
6
7 public class Sort3 {
8      public static void main(String[] args) {
9          List list = new ArrayList<>(); // Utworzenie obiektu ArrayList
10
11        list.add(new Time2(6, 24, 34));
12        list.add(new Time2(18, 14, 58));
13        list.add(new Time2(6, 5, 34));
14        list.add(new Time2(12, 14, 58));
15        list.add(new Time2(6, 24, 22));
16
17         // Wyświetlenie elementów z List
18         System.out.printf("Nieposortowane elementy tablicy:%n%s%n", list);
19
20         // Sortowanie z użyciem własnego obiektu TimeComparator
21         Collections.sort(list, new TimeComparator());
22
23         // Wyświetlenie elementów z List
24         System.out.printf("Posortowane elementy tablicy:%n%s%n", list);
25     }
26 }

Nieposortowane elementy tablicy:
[6:24:34 AM, 6:14:58 PM, 6:05:34 AM, 12:14:58 PM, 6:24:22 AM]
Posortowane elementy tablicy:
[6:05:34 AM, 6:24:22 AM, 6:24:34 AM, 12:14:58 PM, 6:14:58 PM]

Rysunek 16.9. Metoda sort klasy Collections używająca niezależnego obiektu Comparator

 

Metoda shuffle

Metoda shuffle dokonuje losowej zmiany kolejności elementów z obiektu List. Na rysunku 16.10 używamy metody shuffle, aby przetasować talię kart (obiekty Card) w dowolnej grze karcianej.

1 // Rysunek 16.10. DeckOfCards.java
2 // Przetasowanie talii kart jako przykład użycia metody shuffle klasy Collections
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 // Klasa Card reprezentująca kartę z talii
8 class Card {
9      public enum Face {As, Dwójka, Trójka, Czwórka, Piątka, Szóstka,
10        Siódemka, Ósemka, Dziewiątka, Dziesiątka, Walet, Dama, Król }
11    public enum Suit {trefl, karo, kier, pik}
12
13    private final Face face;
14    private final Suit suit;
15
16    // Konstruktor
17    public Card(Face face, Suit suit) {
18        this.face = face;
19        this.suit = suit;
20    }
21
22    // Zwróć figurę karty
23    public Face getFace() {return face;}
24
25    // Zwróć kolor karty
26    public Suit getSuit() {return suit;}
27
28    // Zwróć tekstową reprezentację karty
29    public String toString() {
30        return String.format("%s %s", face, suit);
31    }
32 }
33
34 // Deklaracja klasy DeckOfCards
35 public class DeckOfCards {
36     private List list; // Deklaracja List, która będzie przechowywać obiekty Card
37
38     // Skonfiguruj talię kart i przemieszaj ją
39     public DeckOfCards() {
40         Card[] deck = new Card[52];
41         int count = 0; // Numer karty
42
43         // Wypełnij talię obiektami Card
44         for (Card.Suit suit : Card.Suit.values()) {
45             for (Card.Face face : Card.Face.values()) {
46                 deck[count] = new Card(face, suit);
47                 ++count;
48             }
49         }
50
51         list = Arrays.asList(deck); // Pobierz List
52        Collections.shuffle(list); // Przemieszaj talię
53    }
54
55    // Wyświetl karty
56    public void printCards() {
57         // Wyświetl wszystkie 52 karty w czterech kolumnach
58         for (int i = 0; i < list.size(); i++) {
59             System.out.printf("%-19s%s", list.get(i),
60                 ((i + 1) % 4 == 0) ? System.lineSeparator() : "");
61         }
62    }
63
64    public static void main(String[] args) {
65        DeckOfCards cards = new DeckOfCards();
66        cards.printCards();
67    }
68 }


Rysunek 16.10. Przetasowanie talii kart jako przykład użycia metody shuffle klasy Collections

Król trefl Dziewiątka karo Dziewiątka pik Czwórka kier
Piątka trefl Trójka kier Dama pik Dziewiątka kier
Dziesiątka kier Dwójka pik Piątka pik Siódemka kier
Dama trefl Siódemka pik As pik Walet trefl
Trójka pik Ósemka karo Dwójka karo Piątka kier
Dziesiątka trefl Walet kier Dwójka trefl Szóstka kier
Ósemka trefl As kier Trójka karo Trójka trefl
Król kier Król pik Czwórka karo Szóstka pik
Ósemka kier Walet karo Król karo Siódemka karo
Dziesiątka pik Czwórka trefl Dziewiątka trefl Ósemka pik
Dama karo Piątka karo Dziesiątka karo As trefl
Szóstka trefl Siódemka trefl Walet pik Dama kier
As karo Szóstka karo Dwójka kier Czwórka pik

Rysunek 16.10. Przetasowanie talii kart jako przykład użycia metody shuffle klasy Collections

Klasa Card (wiersze od 8. do 32.) reprezentuje kartę z talii. Każda karta ma określony kolor i figurę. Wiersze od 9. do 11. deklarują dwa typy enum — Face i Suit — reprezentujące odpowiednio figurę i kolor karty. Metoda toString (wiersze od 29. do 31.) zwraca tekst zawierający nazwę koloru i figury oddzielone zwykłą spacją " ". Gdy stała enum jest zamieniana na tekst, domyślną jej reprezentacją tekstową jest nazwa identyfikatora. Choć standardowo użylibyśmy stałych enum pisanych w całości dużymi literami, tym razem odstępujemy od tej zasady, aby uzyskać właściwy zapis figury i koloru karty.

Wiersze od 44. do 49. wypełniają tablicę deck kartami, które mają unikatową kombinację figury i koloru. Zarówno Face, jak i Suit to publiczne i statyczne typy enum klasy Card. Aby użyć ich poza klasą Card, trzeba zastosować przed nimi nazwę klasy (Card) i znak kropki (.). Z tego powodu wierze 44. i 45. używają Card.Suit i Card.Face do deklarowania zmiennych w pętli sterującej. Przypomnijmy, że metoda values typu enum zwraca tablicę zawierającą wszystkie stałe danego typu. Wiersze od 44. do 49. wykorzystują rozszerzone wersje instrukcji for do tworzenia 52 różnych obiektów Card. Przemieszanie ma miejsce w wierszu 52., który wywołuje metodę statyczną shuffle klasy Collections, aby przemieszać karty. Metoda shuffle wymaga argumentu
List, więc musimy uzyskać widok List dla tablicy, zanim ją przemieszamy. Wiersz 51. wywołuje metodę statyczną asList klasy Arrays, aby pobrać tablicę deck jako obiekt List.

Metoda printCards (wiersze od 56. do 62.) wyświetla talię kart w czterech kolumnach. W każdej iteracji pętli wiersze 59. i 60. wyświetlają pole o 19 znakach wyrównane do lewej, po którym następuje znak nowego wiersza lub pusty tekst (w zależności od liczby wyświetlonych do tej pory kart). Jeśli liczba wyświetlonych kart jest podzielna przez 4, używamy znaku nowego wiersza, a w przeciwnym razie pustego tekstu. Zwróć uwagę, że wiersz 60. używa metody lineSeparator klasy System, aby pobrać znak nowego wiersza specyficzny dla używanej platformy.

 

Metody reverse, fill, copy, max i min

Klasa Collections zapewnia również metody do odwracania, wypełniania i kopiowania list. Metoda reverse klasy Collections odwraca kolejność elementów listy, metoda fill nadpisuje elementy listy wskazanym obiektem. Operacja wypełnienia przydaje się, gdy chcemy ponownie zainicjalizować obiekt List. Metoda copy przyjmuje dwa argumenty — docelowy obiekt List i obiekt List służący jako źródło danych. Każdy element listy źródłowej trafia do docelowej. Lista docelowa musi być przynajmniej tak długa, jak źródłowa. W przeciwnym razie wystąpi wyjątek IndexOutOfBoundsException. Jeśli docelowa lista jest dłuższa od źródłowej,
nadmiarowe elementy pozostają bez zmian.

Opisywane do tej pory metody działały tylko na obiektach List. Metody max i min działają na każdym obiekcie typu Collection. Metoda min zwraca najmniejszy element kolekcji, a metoda max największy. Obie metody można wywołać z obiektem Comparator jako drugim argumentem, aby przeprowadzić własne porównanie obiektów, podobnie jak to miało miejsce z klasą TimeComparator na rysunku 16.9. Rysunek 16.11 przedstawia metody reverse, fill, copy, max i min.

1 // Rysunek 16.11. Algorithms1.java
2 // Metody reverse, fill, copy, max i min klasy Collections
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 public class Algorithms1 {
8     public static void main(String[] args) {
9         // Utwórz i wyświetl List
10       Character[] letters = {'P', 'C', 'M'};
11       List list = Arrays.asList(letters); // Pobierz jako List
12       System.out.println("list zawiera: ");
13       output(list);
14
15       // Odwróć i wyświetl List
16       Collections.reverse(list); // Odwróć kolejność elementów
17       System.out.printf("%nPo wywołaniu reverse list zawiera:%n");
18       output(list);
19
20       // Utwórz copyList z tablicy 3 obiektów Character
21       Character[] lettersCopy = new Character[3];
22       List copyList = Arrays.asList(lettersCopy);
23
24       // Skopiuj zawartość list do copyList
25       Collections.copy(copyList, list);
26       System.out.printf("%nPo kopiowaniu copyList zawiera:%n");
27       output(copyList);
28
29       // Wypełnij list literą R
30       Collections.fill(list, 'R');
31       System.out.printf("%nPo wywołaniu fill list zawiera:%n");
32       output(list);
33    }
34
35    // Wyświetlenie informacji o List
36    private static void output(List listRef) {
37        System.out.print("Lista to: ");
38
39        for (Character element : listRef) {
40            System.out.printf("%s ", element);
41        } 
42
43        System.out.printf("%nMaksimum: %s", Collections.max(listRef));
44        System.out.printf(" Minimum: %s%n", Collections.min(listRef));
45    }
46 }

list zawiera:
Lista to: P C M
Maksimum: P Minimum: C
Po wywołaniu reverse list zawiera:
Lista to: M C P
Maksimum: P Minimum: C
Po kopiowaniu copyList zawiera:
Lista to: M C P
Maksimum: P Minimum: C
Po wywołaniu fill list zawiera:
Lista to: R R R
Maksimum: R Minimum: R

Rysunek 16.11. Metody reverse, fill, copy, max i min klasy Collections 


Wiersz 11. tworzy zmienną List o nazwie list i inicjalizuje ją widokiem List tablicy znaków letters. Wiersze 12. i 13. przekazują na wyjście aktualną zawartość listy. Wiersz 16. wywołuje metodę reverse klasy Collections, aby odwrócić kolejność elementów listy. Metoda reverse przyjmuje jeden argument typu List. Ponieważ zmienna list zawiera widok List tablicy letters, elementy tablicy zostały odwrócone. Odwróconą zawartość wyświetlają wiersze 17. i 18. Wiersz 25. używa metody copy klasy Collections do skopiowania elementów list do copyList. Zmiany w copyList nie wpływają na letters, ponieważ copyList to
niezależna lista, która nie jest widokiem tablicy letters. Metoda copy wymaga dwóch argumentów typu List — listy docelowej i listy źródłowej. Wiersz 30. wywołuje metodę fill klasy Collections, aby umieścić znak 'R' w każdym elemencie listy. Ponieważ zmienna list to widok tablicy letters, operacja zmienia również zawartość tablicy na wartości 'R'. Metoda fill wymaga jako pierwszego argumentu obiektu List, a jako drugiego argumentu — typu elementów zawartych w liście (w tym przypadku jest to obiekt otoczkowy Character dla litery 'R'). Wiersze 43. i 44. metody output wywołują metody max i min klasy Collections, aby znaleźć odpowiednio największy i najmniejszy element kolekcji. Pamiętaj, że interfejs List rozszerza interfejs Collection, więc List jest Collection.

 

Metoda binarySearch

Algorytm szybkiego wyszukiwania binarnego jest wbudowany we framework kolekcji Javy jako metoda statyczna binarySearch klasy Collections. Metoda ta znajduje obiekt w obiekcie List (np. LinkedList lub ArrayList). Jeśli obiekt uda się znaleźć, metoda zwraca
jego indeks. Jeśli nie uda się go odnaleźć, zwróci wartość ujemną. Metoda określa tę wartość ujemną, obliczając punkt wstawienia i czyniąc jego znak ujemnym. Następnie odejmuje 1 od punktu wstawienia, aby pobrać wartość do zwrócenia, co daje gwarancję, że metoda zwróci wartości dodatnie (>= 0) tylko wtedy, gdy obiekt uda się odnaleźć. Jeżeli wiele elementów listy pasuje do poszukiwanego obiektu, nie ma gwarancji, który z nich zostanie znaleziony jako pierwszy. Na rysunku 16.12 używamy metody binarySearch do wyszukiwania w ArrayList wybranych tekstów.

1 // Rysunek 16.12. BinarySearchTest.java
2 // Metoda binarySearch klasy Collections
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6 import java.util.ArrayList;
7
8 public class BinarySearchTest {
9     public static void main(String[] args) {
10        // Utwórz ArrayList z zawartości tablicy colors
11        String[] colors = {"czerwony", "biały", "niebieski", "czarny", "żółty",
12        "purpurowy", "brązowy", "różowy"};
13        List list = new ArrayList<>(Arrays.asList(colors));
14
15        Collections.sort(list); // Posortuj ArrayList
16        System.out.printf("Posortowana ArrayList: %s%n", list);
17
18        // Poszukaj w liście różnych wartości
19        printSearchResults(list, "czarny");
20        printSearchResults(list, "czerwony");
21        printSearchResults(list, "różowy");
22        printSearchResults(list, "amarantowy"); // Pod najniższym
23        printSearchResults(list, "szary"); // Nie istnieje
24        printSearchResults(list, "kawowy"); // Nie istnieje
25    }
26
27    // Przeprowadź wyszukiwanie i wyświetl wyniki
28    private static void printSearchResults(
29        List list, String key) {
30
31        System.out.printf("%nSzukam: %s%n", key);
32        int result = Collections.binarySearch(list, key);
33
34        if (result >= 0) {
35            System.out.printf("Znaleziono pod indeksem %d%n", result);
36        }
37        else {
38            System.out.printf("Nie znaleziono (%d)%n", result);
39        }
40     }
41 }

Posortowana ArrayList: [biały, brązowy, czarny, czerwony, niebieski, ?purpurowy, różowy, żółty]
Szukam: czarny
Znaleziono pod indeksem 2

Szukam: czerwony
Znaleziono pod indeksem 3
Szukam: różowy
Znaleziono pod indeksem 6
Szukam: amarantowy
Nie znaleziono (-1)
Szukam: szary
Nie znaleziono (-8)
Szukam: kawowy
Nie znaleziono (-5)

Rysunek 16.12. Metoda binarySearch klasy Collections

 

Wiersz 13. inicjalizuje zmienną list obiektem ArrayList zawierającym kopie elementów tablicy colors. Metoda binarySearch klasy Collections oczekuje, że obiekt List przekazany jako argument ma posortowane elementy w porządku rosnącym, więc wiersz 15. wywołuje metodę sort klasy Collections, aby posortować listę. Jeśli lista nie będzie posortowana, wynik działania metody binarySearch będzie nieokreślony. Wiersz 16. wyświetla posortowaną listę. Wiersze od 19. do 24. wywołują metodę printSearchResults (wiersze od 28. do 41.), która realizuje wyszukanie i wyświetla jego wynik. Wiersz 32. wywołuje metodę binarySearch klasy Collections, aby wyszukać w list odpowiedni obiekt key. Metoda binarySearch przyjmuje List jako pierwszy argument, a klucz do wyszukiwania jako drugi argument. Wiersze od 34. do 39. wyświetlają wyniki wyszukiwania. Przeciążona
wersja metody binarySearch klasy Collections przyjmuje obiekt Comparator jako trzeci argument, co pozwala w dowolny sposób porównywać elementy listy. 

 

Metody addAll, frequency i disjoint

Klasa Collections udostępnia również metody addAll, frequency i disjoint. Metoda addAll przyjmuje dwa argumenty: obiekt Collection, do którego należy wstawić nowe elementy, i tablicę (lub listę argumentów o zmiennej długości) z elementami do wstawienia. Metoda frequency przyjmuje dwa argumenty: obiekt Collection przeszukania i poszukiwany obiekt typu Object. Metoda ta zwraca liczbę wystąpień drugiego argumentu wewnątrz kolekcji. Metoda frequency przyjmuje dwa obiekty Collection i zwraca true, jeśli nie mają żadnych elementów wspólnych. Rysunek 16.13 przedstawia przykład użycia metod addAll, frequency
i disjoint.

1 // Rysunek 16.13. Algorithms2.java
2 // Metody addAll, frequency i disjoint klasy Collections
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Arrays;
6 import java.util.Collections;

8 public class Algorithms2 {
9     public static void main(String[] args) {
10       // Zainicjalizuj list1 i list2
11       String[] colors = {"czerwony", "biały", "żółty", "niebieski"};
12       List list1 = Arrays.asList(colors);
13       ArrayList list2 = new ArrayList<>();
14
15       list2.add("czarny"); // Dodaj "czarny" na końcu list2
16       list2.add("czerwony"); // Dodaj "czerwony" na końcu list2
17       list2.add("zielony"); // Dodaj "zielony" na końcu list2
18
19       System.out.print("Przed addAll list2 zawiera: ");
20
21       // Wyświetl elementy list2
22       for (String s : list2) {
23           System.out.printf("%s ", s);
24       }
25
26       Collections.addAll(list2, colors); // Dodaj teksty z colors do list2
27
28       System.out.printf("%nPo addAll list2 zawiera: ");
29
30       // Wyświetl elementy list2
31       for (String s : list2) {
32           System.out.printf("%s ", s);
33       }
34
35       // Pobierz częstość występowania "czerwony"
36       int frequency = Collections.frequency(list2, "czerwony");
37       System.out.printf("%nCzęstość występowania czerwony w list2: %d%n", frequency);
38
39       // Sprawdź, czy list1 i list2 mają jakieś elementy wspólne
40       boolean disjoint = Collections.disjoint(list1, list2);
41
42       System.out.printf("list1 i list2 %s części wspólne%n",
43           (disjoint ? "nie mają" : "mają"));
44     }
45 }

Przed addAll list2 zawiera: czarny czerwony zielony
Po addAll list2 zawiera: czarny czerwony zielony czerwony biały żółty niebieski
Częstość występowania czerwony w list2: 2
list1 i list2 mają części wspólne

Rysunek 16.13. Metody addAll, frequency i disjoint klasy Collections

Wiersz 12. inicjalizuje list1 elementami tablicy colors, a wiersze od 15. do 17. dodają teksty "czarny", "czerwony" i "zielony" do list2. Wiersz 26. wywołuje metodę addAll, aby dodać elementy tablicy colors do list2. Wiersz 36. pobiera częstość występowania tekstu "czerwony" w list2, używając metody frequency. Wiersz 40. wywołuje metodę disjoint, aby sprawdzić, czy kolekcje list1 i list2
mają elementy wspólne (w tym przykładzie mają). 

 

Programowanie w Javie. Solidna wiedza w praktyce. Wydanie XI, Autorzy: Paul Deitel, Harvey Deitel, Wydawnictwo: Helion

Podobne artykuły

Podziel się ze znajomymi tym artykułem - udostępnij na FB lub wyślij e-maila korzystając z poniższych opcji:

wszystkie oferty