Przydatne metody klasy Collections w Javie.

Znajomość kolekcji to już na etapie juniora jedna z bardziej przydatnych umiejętności. Nie chodzi tylko o pytania na rozmowach rekrutacyjnych, ale o przydatną w pracy biegłość w operowaniu na kolekcjach. Dlatego warto zapoznać się z klasą Collections w java.util, będącą częścią Java Collections Framework, która pozwala wykorzystać proste lecz przydatne funkcje. Kilka z nich omówię poniżej.

frequency() – znajdź elementy powtarzające się podaną liczbę razy

Metoda, która pozwala znaleźć elementy kolekcji powtarzające się konkretną liczbę razy. Może nie wydaje się początkowo bardzo przydatna, ale przyznam, że pozwoliła mi kiedyś szybko wykonać zadanie już w pierwszym roku zawodowego programowania.

Wyobraźmy sobie listę zamówień z przypisanym ID klienta i próbę posegregowania klientów według liczby zamówień np. w celu wysyłki bonów rabatowych. Dzięki metodzie frequency() możemy szybko dokonać takiego filtrowania w strumieniach, jak poniżej:

List<Long> customerIds = orders.stream().map(Order::getClientId).collect(Collectors.toList());
List<Long> silverCustomers = customerIds.stream()
        .filter(i -> Collections.frequency(customerIds, i) > 1
                        && Collections.frequency(customerIds, i) <= 5)
        .distinct()
        .collect(Collectors.toList());

List<Long> goldCustomers = customerIds.stream()
        .filter(i -> Collections.frequency(customerIds, i) > 5
                && Collections.frequency(customerIds, i) <= 10)
        .distinct()
        .collect(Collectors.toList());

List<Long> platinumCustomers = customerIds.stream()
        .filter(i -> Collections.frequency(customerIds, i) > 10)
        .distinct()
        .collect(Collectors.toList());

disjoint() – czyli sprawdźmy czy dwie kolekcje mają wspólne elementy bądź nie

disjoint() to metoda, która sprawdza czy dwie kolekcje nie mają wspólnych elementów. Jeżeli element jednej kolekcji będzie zgodna, czyli metoda equals() dla porównania obiektów zwróci true, to disjoint() zwróci false. Jeżeli przynajmniej jedna z kolekcji będzie pusta zostanie zwrócona wartość true, gdyż w takim przypadku żadne elementy nie mogą się powtórzyć w obu kolekcjach.

Do czego możemy użyć metody disjoint() w praktyce? Do czegoś z goła odwrotnego, czyli sprawdzenia czy dwie kolekcje mają chociaż jeden wspólny element. Wyobraźmy sobie, że chcemy wysłać wiadomość do użytkowników do jednej z grup określonych w zbiorze (np. grup w portalu społecznościowym) określonych w zbiorze. Przy czym użytkownicy mogą spełniać również należeć do kilku grup. Poniżej prosty kod pokazujący wykorzystanie metody disjoint() w ten właśnie sposób.

Set<Integer> requiredGroupIds = Set.of(1231, 2321, 3342);
List<Integer> userGroupIds = List.of(1261, 1241, 4212);

boolean isValid = !Collections.disjoint(groupIds, userGroupIds);

binarySearch() – czyli szybsze wyszukiwanie dla sortowanych list

Słyszeliście pewnie o wyszukiwaniu binarnym lub być może o metodzie dziel i zwyciężaj. Po krótce metoda ta polega na dzieleniu większego problemu na mniejsze, dzięki czemu szybciej możemy znaleźć rozwiązanie. W przypadku wyszukiwania binarnego jest to dzielenie jednej listy na mniejsze zakresy do momentu znalezienia wyniku. Jeżeli mamy posortowaną kolekcję zawierającą miliard elementów, to wykonując tylko jeden krok – sprawdzenie środkowego elementu, nasza kolekcja do przeszukania zmniejsza się o połowę.

Metoda binarySearch() zwróci indeks znalezionego elementu lub… jak myślicie co w przypadku braku elementu w kolekcji?

List<Integer> userIds = new ArrayList<>();
for (int i = 0; i < 1_000_000; i++) {
    userIds.add(i);
}
int result = Collections.binarySearch(userIds, 3342);
// result = 3342
userIds.remove(3342);
result = Collections.binarySearch(userIds, 3342);
// result = -3343

Jeżeli danego elementu nie ma w kolekcji, to metoda zwróci miejsce, w którem powinien się dany element znaleźć zgodnie z porządkiem, jako wartość - (miejsce, w którym powinien być element) - 1. Czyli dla indeksu 3342 jest to -3342 – 1 = -3343.

To oczywiście nie wszystkie metody klasy Collections. Jest tam jeszcze wiele ciekawych rozwiązań np. w kwestii sortowania, przesuwania czy tasowania elementów. Zachęcam do samodzielnego zapoznania się z dokumentacją na stronie https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html

Jeżeli macie uwagi bądź pytania, piszcie w komentarzach.

Przydatne metody klasy Collections w Javie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Przewiń do góry