CodeGym /Kurslar /JAVA 25 SELF /Kolleksiyaların çevrilməsi

Kolleksiyaların çevrilməsi

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Kolleksiya elementlərinin çevrilməsi

Proqramlaşdırmada ən çox rast gəlinən əməliyyatlardan biri — kolleksiyanın çevrilməsidir: bir tipdə olan məlumat kolleksiyasından başqa tipdə yeni kolleksiya yaratmaq. Məsələn, User tipli obyektlərin siyahısından onların adlarının siyahısını (String), yaxud ədədlər siyahısından onların kvadratlarının siyahısını almaq.

Java-da ən fundamental və anlaşılan üsul — imperativ yanaşmadan, yəni adi for dövründən (tez-tez — for-each) istifadə etməkdir.

Nümunə: sətirlər siyahısından onların uzunluqları siyahısını almaq

Tutaq ki, şəhər adlarının siyahısı var:

List<String> cities = List.of("London", "Paris", "Tokio", "Nyu-York");

Vəzifəmiz — hər adın uzunluğunu saxlayan yeni bir siyahı yaratmaq. Nəticə belə olmalıdır: [6, 5, 5, 8].

Həll for dövrü ilə:

import java.util.ArrayList;
import java.util.List;

public class CollectionTransform {
    public static void main(String[] args) {
        List<String> cities = List.of("London", "Paris", "Tokio", "Nyu-York");
        List<Integer> lengths = new ArrayList<>(); // Nəticə üçün yeni, boş siyahı yaradırıq

        for (String city : cities) {
            // Hər bir cities elementinin uzunluğunu hesablayırıq...
            int length = city.length();
            // ...və nəticəni yeni siyahıya əlavə edirik
            lengths.add(length);
        }

        System.out.println(lengths); // Çap edəcək: [6, 5, 5, 8]
    }
}

İlk olaraq nəticələr üçün yeni, boş kolleksiya yaradırıq — çevrilmə ilkin kolleksiyanı dəyişmir. İlkindən keçmək üçün for-each dövründən istifadə edirik və içində hər elementə lazım olan məntiqi (length()) tətbiq edib nəticəni add vasitəsilə yeni siyahıya əlavə edirik.

2. Obyektlərin çevrilməsi

Tez-tez daha mürəkkəb məlumat tipləri ilə işləyirik. Tutaq ki, Product sinfimiz var və onun adlarının (və ya qiymətlərinin) siyahısını əldə etməliyik.

public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

İndi məhsulların siyahısı olduqda, adlarının siyahısını alaq:

import java.util.ArrayList;
import java.util.List;

public class ProductExample {
    public static void main(String[] args) {
        List<Product> products = List.of(
            new Product("Noutbuk", 1200.0),
            new Product("Siçan", 25.5),
            new Product("Klaviatura", 75.0)
        );

        // Adlar üçün yeni siyahı yaradırıq
        List<String> productNames = new ArrayList<>();

        for (Product product : products) {
            // Hər Product obyekti üçün onun adını alırıq
            productNames.add(product.getName());
        }

        System.out.println(productNames); // Çap edəcək: [Noutbuk, Siçan, Klaviatura]
    }
}

Məntiq eynidir: ilkin kolleksiyadan iterasiya edirik, hər elementə lazım olan metodu (məsələn, getName()) tətbiq edirik və nəticəni yeni kolleksiyaya əlavə edirik.

3. Daxili kolleksiyalarla işləmək

Siyahıların siyahısı olan halı nəzərdən keçirək: bir neçə şöbə var, hər birində öz əməkdaş siyahısı. Vəzifə — bütün əməkdaşların vahid (“yastı”) siyahısını almaqdır.

Nümunə: əməkdaş siyahılarının birləşdirilməsi

List<List<String>> departments = List.of(
    List.of("Anna", "Boris"),
    List.of("Viktoriya", "Gleb", "Dmitri"),
    List.of("Elena")
);

İstəyirik ki, yekun siyahı belə olsun: [Anna, Boris, Viktoriya, Gleb, Dmitri, Elena].

Üsul 1: metod vasitəsilə addAll()

import java.util.ArrayList;
import java.util.List;

public class NestedCollectionExample {
    public static void main(String[] args) {
        List<List<String>> departments = List.of(
            List.of("Anna", "Boris"),
            List.of("Viktoriya", "Gleb", "Dmitri"),
            List.of("Elena")
        );

        List<String> allEmployees = new ArrayList<>();

        // Hər siyahı (şöbə) üzrə iterasiya edirik
        for (List<String> department : departments) {
            // Cari siyahıdakı bütün elementləri ümumi siyahıya əlavə edirik
            allEmployees.addAll(department);
        }

        System.out.println(allEmployees); // [Anna, Boris, Viktoriya, Gleb, Dmitri, Elena]
    }
}

Üsul 2: iç-içə dövr — eyni məntiq, ancaq “əl ilə”:

List<List<String>> departments = List.of(...);
List<String> allEmployees = new ArrayList<>();

for (List<String> department : departments) { // Şöbələr üzrə xarici dövr
    for (String employee : department) {      // İşçilər üzrə daxili dövr
        allEmployees.add(employee);
    }
}

System.out.println(allEmployees);

Hər iki üsul nəticə baxımından eynidir. addAll() metodu, əslində, iç-içə dövrün məntiqini kapsullaşdırır və kodu qısaldır.

4. Mürəkkəb hallar və şərtli çevrilmələr

Bəzən çevrilmə yalnız şərtə cavab verən elementlər üçün aparılmalıdır. Məsələn, adı "N" hərfi ilə başlayan şəhərlərin adlarını götürüb onların uzunluqlarını almaq. Burada filtrləmə və çevrilməni birləşdiririk: if + metod çağırışı (length()).

import java.util.ArrayList;
import java.util.List;

public class ConditionalTransform {
    public static void main(String[] args) {
        List<String> cities = List.of("London", "Paris", "Tokio", "Nyu-York", "Nürnberq");
        List<Integer> lengths = new ArrayList<>();

        for (String city : cities) {
            // Əvvəlcə şərti yoxlayırıq
            if (city.startsWith("N")) {
                // Şərt ödənilirsə, çevrilmə tətbiq edirik
                lengths.add(city.length());
            }
        }

        System.out.println(lengths); // Çap edəcək: [8, 8]
    }
}

Şablon belədir: dövr daxilində əvvəlcə elementləri şərt vasitəsilə (məsələn, startsWith, müqayisə, diapazon yoxlaması və s.) filtr edirik, sonra lazım olan çevrilməni tətbiq edib nəticəni yeni siyahıya əlavə edirik.

5. Tipik səhvlər və incəliklər

Səhv №1: keçid zamanı ilkin kolleksiyanın dəyişdirilməsi. Tez-tez rast gəlinən səhv — ilkin kolleksiyaya elə for-each dövründə element əlavə etmək/silmək cəhdi. Bu, səhvlərə və proqnozlaşdırılmayan davranışa səbəb olur. Həll: nəticələr üçün həmişə yeni siyahı yaradın və onu doldurun.

Səhv №2: tiplərin yanlış çevrilməsi. Əgər “xam” kolleksiyalarla (məsələn, Object vasitəsilə) işləyir və elementləri yalnış tipə çevirirsinizsə, ClassCastException alacaqsınız. Generiklərdən (List<T>) istifadə edin və siqnaturlara diqqət edin.

Səhv №3: resurslardan səmərəsiz istifadə. Çox böyük kolleksiyalar üçün yeni siyahıların daimi yaradılması və elementlərin kopiyalanması yaddaş və vaxt baxımından hiss oluna bilər. Əksər gündəlik tapşırıqlarda bu qəbulediləndir, lakin böyük həcmli məlumatları işləyərkən mürəkkəbliyi nəzərə alın və lazım gələrsə, yanaşmanı optimallaşdırın.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Məzun albomu üçün tələbə siyahısının hazırlanması 🎓
Məzun albomu üçün tələbə siyahısının hazırlanması 🎓
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Fərqli sandıqlardakı xəzinələrin birləşdirilməsi 💰
Fərqli sandıqlardakı xəzinələrin birləşdirilməsi 💰
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION