Научитесь объединять два ArrayList в один объединенный ArrayList. Также научитесь объединять ArrayList без дубликатов в объединенном экземпляре списка.
1. Объединение двух ArrayList с сохранением всех элементов
Этот подход сохраняет все элементы из обоих списков, включая дублирующие элементы. Размер объединенного списка будет арифметической суммой размеров обоих списков.
1.1 Использование List.addAll()
Метод addAll() — это самый простой способ добавить все элементы из данного списка в конец другого списка. Используя этот метод, мы можем объединить несколько списков в один.
ArrayList<Строка> listOne = new ArrayList<>(Arrays.asList("a", "b", "c"));ArrayList<String> listTwo = new ArrayList<>(Arrays.asList("c", "d", "e"));listOne.addAll(listTwo); //Объединяем оба спискаSystem.out.println(listOne);System.out.println(listTwo);
Вывод программы.
[а, б, в, в, г, д][с, г, д]
Совет: есть больше способов объединить списки с использованием библиотек, таких как guava или Apache commons lang, но все они используют только метод addAll(). Поэтому лучше использовать этот метод напрямую.
1.2 Использование Stream.flatMap()
Потоки Java 8 предоставляют нам однострочные решения большинства проблем, и в то же время код выглядит чище. Метод flatMap() потока можно использовать для получения элементов двух или более списков в одном потоке, а затем собрать элементы потока в ArrayList.
Рекомендуется использовать Stream, поскольку нам не нужно изменять исходные экземпляры List, и мы создаем третий List с элементами из обоих List.
ArrayList<String> listOne = new ArrayList<>(Arrays.asList("a", "b", "c"));ArrayList<String> listTwo = new ArrayList<>(Arrays.asList("c", "d", "e"));List<String> combinedList = Stream.of(listOne, listTwo).flatMap(x -> x.stream()).collect(Collectors.toList());System.out.println(combinedList);
Вывод программы.
[a, b, c, c, d, e]
В этих примерах мы объединили списки, но в конечном списке у нас были дублирующиеся элементы. Это может быть не желаемым результатом во многих случаях. Далее мы научимся объединять списки, исключая дубликаты.
2. Объединение двух ArrayList, исключая повторяющиеся элементы
Чтобы получить объединенный список без повторяющихся элементов, у нас есть два подхода:
2.1. Использование LinkedHashSet
Наборы Java допускают только уникальные элементы. Когда мы помещаем оба списка в набор, набор будет представлять список всех объединенных уникальных элементов. В нашем примере мы используем LinkedHashSet, поскольку он также сохранит порядок элементов.
ArrayList<String> listOne = new ArrayList<>(Arrays.asList("a", "b", "c"));ArrayList<String> listTwo = new ArrayList<>(Arrays.asList("c", "d", "e"));//Add items from Lists into SetSet<String> set = new LinkedHashSet<>(listOne);set.addAll(listTwo);//Convert Set to ArrayListArrayList<String> combinedList = new ArrayList<>(set);System.out.println(combinedList);
[а, б, в, г, д]
2.2. Использование removeAll/addAll
Это двухэтапный процесс, и мы можем
- Удалить все элементы первого списка из второго списка,
- а затем добавьте первый список ко второму списку.
Это предоставит пользователям объединенный список без повторяющихся элементов.
ArrayList<String> listOne = new ArrayList<>(Arrays.asList("a", "b", "c"));ArrayList<String> listTwo = new ArrayList<>(Arrays.asList("c", "d", "e"));List<String> listTwoCopy = new ArrayList<>(listTwo);listTwoCopy.removeAll(listOne);listOne.addAll(listTwoCopy);System.out.println(listOne);
Вывод программы.
[а, б, в, г, д]