Jak scalić dwie listy w Javie?

Photo of author

By maciekx

Wprowadzenie

Łączenie list w środowisku Java to czynność polegająca na połączeniu dwóch lub większej liczby list w jedną, nową strukturę danych. Operacja ta znajduje zastosowanie w wielu sytuacjach, na przykład, gdy chcemy zgromadzić informacje z różnych miejsc lub wyeliminować powtarzające się elementy z listy. W Javie istnieje kilka możliwości realizacji tego zadania, z których każda ma swoje plusy i minusy. W tym opracowaniu przyjrzymy się czterem popularnym technikom łączenia list w Javie.

1. Wykorzystanie metody addAll()

Metoda addAll(), będąca częścią interfejsu Collection, umożliwia dodanie wszystkich elementów jednej kolekcji do drugiej. Możemy ją użyć do połączenia dwóch list w następujący sposób:

java
List<String> lista1 = new ArrayList<>();
lista1.add("Ania");
lista1.add("Zosia");

List<String> lista2 = new ArrayList<>();
lista2.add("Kasia");
lista2.add("Basia");

// Połączenie list za pomocą metody addAll()
lista1.addAll(lista2);

System.out.println(lista1); // [Ania, Zosia, Kasia, Basia]

addAll() to szybki i prosty sposób na połączenie list, jednak ma pewne ograniczenia. Po pierwsze, łączone listy muszą być tego samego typu. Po drugie, jeśli któraś z list zawiera powtórzenia, zostaną one zachowane w wynikowej liście.

2. Użycie konstruktora ArrayList

Inną metodą połączenia list jest wykorzystanie konstruktora ArrayList, który przyjmuje kolekcję jako argument. Ten konstruktor tworzy nową listę, która zawiera wszystkie elementy z podanej kolekcji. Można go użyć do połączenia dwóch list w taki sposób:

java
List<String> lista1 = new ArrayList<>();
lista1.add("Ania");
lista1.add("Zosia");

List<String> lista2 = new ArrayList<>();
lista2.add("Kasia");
lista2.add("Basia");

// Połączenie list za pomocą konstruktora ArrayList
List<String> lista3 = new ArrayList<>(lista1);
lista3.addAll(lista2);

System.out.println(lista3); // [Ania, Zosia, Kasia, Basia]

To podejście jest podobne do metody addAll(), z tą różnicą, że tworzy nową, połączoną listę, która nie jest zależna od pierwotnych list. Jest to przydatne, jeśli zależy nam na zachowaniu oryginalnych list bez zmian.

3. Wykorzystanie metody stream()

Począwszy od Javy 8, mamy do dyspozycji metodę stream(), która umożliwia operacje na strumieniach danych. Można jej użyć do połączenia dwóch list w następujący sposób:

java
List<String> lista1 = new ArrayList<>();
lista1.add("Ania");
lista1.add("Zosia");

List<String> lista2 = new ArrayList<>();
lista2.add("Kasia");
lista2.add("Basia");

// Połączenie list za pomocą metody stream()
List<String> lista3 = Stream.concat(lista1.stream(), lista2.stream()).toList();

System.out.println(lista3); // [Ania, Zosia, Kasia, Basia]

Metoda stream() jest bardzo uniwersalna, ale w przypadku dużych list może być mniej efektywna niż inne metody.

4. Użycie kolekcji LinkedHashSet

Kolekcja LinkedHashSet przechowuje elementy w kolejności ich dodania i nie pozwala na duplikaty. Można jej użyć do połączenia list i usunięcia duplikatów w następujący sposób:

java
List<String> lista1 = new ArrayList<>();
lista1.add("Ania");
lista1.add("Zosia");

List<String> lista2 = new ArrayList<>();
lista2.add("Kasia");
lista2.add("Basia");
lista2.add("Ania"); // Powtórzenie

// Połączenie list za pomocą kolekcji LinkedHashSet
Set<String> zbior = new LinkedHashSet<>(lista1);
zbior.addAll(lista2);

List<String> lista3 = new ArrayList<>(zbior);

System.out.println(lista3); // [Ania, Zosia, Kasia, Basia]

Ta metoda jest szczególnie przydatna, gdy chcemy połączyć listy i jednocześnie pozbyć się powtórzeń. Należy jednak pamiętać, że kolejność elementów w wynikowej liście może być inna niż w listach źródłowych.

Podsumowanie

Łączenie list w Javie jest prostym zadaniem, które można zrealizować na różne sposoby. Metoda addAll() jest prosta i szybka, ale zachowuje duplikaty. Konstruktor ArrayList umożliwia utworzenie nowej listy, ale wymaga skopiowania elementów. Metoda stream() jest uniwersalna, ale może być mniej efektywna w przypadku dużych list. Kolekcja LinkedHashSet łączy listy i usuwa duplikaty, ale może zmieniać kolejność elementów. Wybór najlepszej metody zależy od specyficznych potrzeb i scenariusza użycia.

Najczęściej zadawane pytania

* Czy można połączyć listy różnych typów w Javie?

Nie, listy muszą być tego samego typu, aby można je było połączyć.

* Czy metody łączenia zachowują kolejność elementów?

Metody addAll() i konstruktor ArrayList zachowują kolejność elementów z list oryginalnych. Metoda stream() może zmienić kolejność, a kolekcja LinkedHashSet zachowuje kolejność dodawania elementów.

* Czy można połączyć listy zawierające obiekty?

Tak, można połączyć listy zawierające obiekty, ale muszą one być tego samego typu.

* Jak usunąć powtórzenia podczas łączenia list?

Aby usunąć powtórzenia, można skorzystać z kolekcji LinkedHashSet.

* Czy można połączyć listy równolegle?

Tak, można połączyć listy równolegle za pomocą metody parallelStream().

* Czy w Javie istnieje wbudowana metoda do łączenia list?

Nie, w Javie nie ma jednej wbudowanej metody do łączenia list.

* Co zrobić, gdy listy zawierają elementy null?

Elementy null są dozwolone w listach w Javie. Jeśli listy zawierają elementy null, zostaną one zachowane w połączonej liście.

* Czy łączenie list jest operacją modyfikującą?

Łączenie list za pomocą metody addAll() modyfikuje oryginalną listę. Użycie konstruktora ArrayList lub metody stream() tworzy nową połączoną listę.


newsblog.pl