@askalidov

Как объединить 2 ArrayList в 1 по совпадающему значению (id)?

Есть 2 ArrayList
List<Product> productListWithUrlName = new ArrayList<>();
List<Product> productListWithPrice = new ArrayList<>();

В первом содержатся продукты, у них есть id, имя, и ссылкой на каждый. Во втором - те же продукты, у них есть id (совпадают с id из первого списка) и их стоимость. Необходимо объединить их по этому самому id.

Пример:
В первом списке:
Product[id=1, url="SomeURL", name="Product1"],
во втором:
Product[id=1, price=1000].

Вывод должен быть соответственно:
Product[id=1, url="SomeURL", name="Product1", price=1000].
  • Вопрос задан
  • 566 просмотров
Решения вопроса 2
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Одно из возможных решений:
- создайте Map<Long, Product>
Long - id продукта
- Добавьте элементы первого List'а в Map.
- Итерируйте по второму List'у. Внутри цикла получите товар из Map по идентификатору объекта из второго List'a.
- При помощи сеттеров назначьте значения.
- Если товара с таким ID нет, то добавьте в Map

Вот, похожий вопрос - https://stackoverflow.com/questions/12670756/join-...
Ответ написан
Комментировать
xez
@xez Куратор тега Java
TL Junior Roo
Собираем из коллекции Map, в которой key - это id, а value - сам объект. Коллектор третьим аргументом принимает merge-функцию:
var productListWithUrlName = new ArrayList<Product>();
        var productListWithPrice = new ArrayList<Product>();

        var mergedProducts = Stream.concat(productListWithPrice.stream(), productListWithUrlName.stream())  // Объединяем коллекции
                .collect(Collectors.toMap(Product::id, Function.identity(), (product1, product2) -> mergeProducts(product1, product2)));


Остается реализовать метод mergeProducts, который будет объединять два Product и возвращать результат.
private Product mergeProducts(Product product1, Product product2) {
        // TODO :: реализовать объединение двух Product
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы