Форум программистов, компьютерный форум, киберфорум
Java: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/191: Рейтинг темы: голосов - 191, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63

Сравнение элементов двух коллекций через Stream API

26.06.2018, 12:18. Показов 37746. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, комрады!

Есть класс Person, содержащий HashMap с данными на человека:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person {
    private HashMap<String, String> item = new HashMap<>();
 
    public Person setItem(String key, String val) {
        item.put(key, val);
        return this;
    }
    
    public String getValByKey(String key) {
        return item.get(key);
    }
    
    public HashMap<String, String> getItem() {
        return item;
    }
}
Из этих Person собираются два ArrayList.
Количество элементов в листах и данных в Person м.б. различно. Все зависит от подложенных эксель файлов.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
 
    public static void main(String[] args) {
//Здесь все будет заполняться циклом, проходящим по каждой строке файлов 1 и 2.
        List<Person> ls1 = new ArrayList<>();
        ls1.add(new Person().setItem("numString", "1").setItem("name", "Вася").setItem("surname", "Сидоров"));
        ls1.add(new Person().setItem("numString", "2").setItem("name", "Петя").setItem("surname", "Пупкин"));
        ls1.add(new Person().setItem("numString", "3").setItem("name", "Коля").setItem("surname", "Петров"));
 
        List<Person> ls2 = new ArrayList<>();
        ls2.add(new Person().setItem("numString", "1").setItem("name", "Вася").setItem("surname", "Сидоров"));
        ls2.add(new Person().setItem("numString", "2").setItem("name", "Стас").setItem("surname", "Михайлов"));
        ls2.add(new Person().setItem("numString", "3").setItem("name", "Филя").setItem("surname", "Киркоров"));
Вопрос: можно ли с помощью Stream API более менее красиво, но, что более важно, компактно сравнить эти две коллекции и если есть совпадение по фамилии с именем либо добавить в первую коллекцию данные из второй (часть данных из 1 коллекции может совпадать с частью данных из 2), либо наполнять третью коллекцию (что-то типа List<Pair>)?

Максимум, на что меня хватило, это сравнивать две коллекции, а вот с заполнением проблемы. Это один из вариантов:
Java
1
2
3
4
5
List<Person> ls3 = ls1.stream().peek(o -> {
            if (ls2.stream().anyMatch(p -> p.getValByKey("surname").equals(o.getValByKey("surname"))))
                o.setItem("!!!", "+++");
            })
            .collect(Collectors.toList());
Заранее благодарю!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2018, 12:18
Ответы с готовыми решениями:

Сравнить элементы двух коллекций <Float> и создать результирующую коллекцию, состоящую из больших элементов
Создайте метод , который позволяет сравнивать элементы двух коллекций &lt;Float&gt; и создать результирующую коллекцию, состоящую из больших...

Сравнение коллекций во вложенных цикле
Существует следующая проблема. Есть коллекции, которые нужно сравнить с коллекцией word, и если слово совпадает, то его нужно удалить...

Сравнение коллекций
есть кулинарная книга. в которой нужно сделать поиск по рецептам(пользователь вводит неизвестное заранее количество ингридиентов) затем...

33
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7393 / 4820 / 1246
Регистрация: 30.03.2015
Сообщений: 13,703
Записей в блоге: 29
27.06.2018, 06:25
Студворк — интернет-сервис помощи студентам
wolf05632, это ты к чему? теперь все поля дублера к оригиналу перекинет, согласно стриму
0
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
27.06.2018, 10:29  [ТС]
Welemir1, да так, сарказм. Просто мне показалось, что ты немного психанул)))), а я этого не хотел.

Гляжу на последний пример от тебя и понимаю, что сам бы в жизни не догадался. Не умею грамотно пользовать существующие ФИ.

Единственное, вопрос по этой строке:
Java
1
ls2.stream().filter(ls1::contains).forEach(n -> addingMap.accept(ls1, n));
По какому алгоритму тут будет contains работать? Сравнивать Person`ы на идентичность? Тогда надо будет contains заоверрайдить, чтобы смотрел по ФИО. Правильно?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7393 / 4820 / 1246
Регистрация: 30.03.2015
Сообщений: 13,703
Записей в блоге: 29
27.06.2018, 11:01
Цитата Сообщение от wolf05632 Посмотреть сообщение
По какому алгоритму тут будет contains работать?
а помнишь я тебе equals в класс персоны докинул? как раз для этого!

Цитата Сообщение от wolf05632 Посмотреть сообщение
Тогда надо будет contains заоверрайдить,
нихт ферштейн
0
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
27.06.2018, 11:14  [ТС]
А, у нас же contains дергает equals! Вопросов больше не имею)))
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7393 / 4820 / 1246
Регистрация: 30.03.2015
Сообщений: 13,703
Записей в блоге: 29
27.06.2018, 14:56
wolf05632, ты не забыл ничего? взять назад слова о стримах!
0
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
27.06.2018, 17:00  [ТС]
Делаю официальное заявление: беру свои слова о стримах обратно!

ЗЫ: есть ссылки на что-нибудь стоящее по стримам и лямбдам?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.06.2018, 18:30
Цитата Сообщение от wolf05632 Посмотреть сообщение
есть ссылки
google.com
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7393 / 4820 / 1246
Регистрация: 30.03.2015
Сообщений: 13,703
Записей в блоге: 29
27.06.2018, 18:31
wolf05632, их есть у меня!
Richard Reese "Learning Java functional programming"
Ричард Уорбэртон "Лямбда-выражения в Java 8"
Java 8 in action
все есть на просторах бездонного
1
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
27.06.2018, 21:55  [ТС]
Welemir1
Уорбэртона сейчас читаю. Че-т не заходит мне его подача материала...
Остальное посмотрю обязательно. Спасибо!

xoraxax
Что такое google.com? Надо будет у яндекса спросить.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
28.06.2018, 22:39
Цитата Сообщение от wolf05632 Посмотреть сообщение
Вопрос: можно ли с помощью Stream API более менее красиво, но, что более важно, компактно сравнить эти две коллекции и если есть совпадение по фамилии с именем либо добавить в первую коллекцию данные из второй (часть данных из 1 коллекции может совпадать с частью данных из 2), либо наполнять третью коллекцию (что-то типа List<Pair>)?
Это называется не «сравнить» (что, в общем случае для коллекций бессмысленно), а объединение множеств. Причём не простое (equals), а с объединением подмножеств. Что ты вообще тут подразумеваешь под объединением? По какому критерию оно должно происходить? Какую роль несёт ключ в Map<> item? Какую роль в нём несёт значение? Как они должны «объединиться» в результате?

Добавлено через 2 минуты
А, так у тебя Person через одно место сделан. На кой чёрт тебе там Map? Сделай нормальные поля, типа

Java
1
2
3
4
5
class Person {
    String numString;
    String name;
    String surname;
}
и жизнь станет легче.
0
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
29.06.2018, 10:19  [ТС]
korvin_

Повторяю в четвертый раз: какие поля будут даны в эксель файле, такие и будут браться и их число заранее неизвестно.
Ключ в мапе - это имя столбца (которое, опять же повторяюсь, заранее неизвестно) Как я должен поля заранее объявлять в такой ситуации? Или сделать миллион полей, "на всякий случай"?

В любом случае, Welemir1 дал мне ответ на мой вопрос. Тему можно закрывать.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
29.06.2018, 13:29
Цитата Сообщение от wolf05632 Посмотреть сообщение
какие поля будут даны в эксель файле, такие и будут браться и их число заранее неизвестно.
Ключ в мапе - это имя столбца (которое, опять же повторяюсь, заранее неизвестно
Что ты тогда вообще «объединять» собрался?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7393 / 4820 / 1246
Регистрация: 30.03.2015
Сообщений: 13,703
Записей в блоге: 29
29.06.2018, 13:45
wolf05632, тебе кстати справедливо старшие товарищи указывают на то, что в твоей эксельке может не быть поля surname и тогда ничего из написанного (equals то привязан к фамилии) не сработает.
0
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 63
29.06.2018, 18:49  [ТС]
Не, я не спорю, мож чего-то не понимаю, но:

1. Что выбрать ключевым полем (по которому буду сравнивать) - это моя забота. Сюрнэйм, или что-то другое. Могу вообще пометить флагом нужные поля - и они будут ключевые.
2. Объединять собрался все пары ключ-значение мап, по которым совпали ключевые поля. Ключи мне будут нужны для дальнейшей работы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2018, 18:49

Сравнение коллекций
Доброго времени суток) Есть код: package ru.myscanner.scannerth; import java.io.File; import java.util.ArrayList; import...

Быстрое сравнение коллекций
Есть 2 коллекции List&lt;SomeItem&gt;. Одна исходная, с другой работаю. Каким образом можно в коде (к примеру по какому либо моему событию)...

Сравнение коллекций по столбцам
Здравствуйте. У меня два распарсенных файла, занесенных в коллекции atomList.Add(at) и atomList2.Add(atn). В каждой коллекции...

Сравнение коллекций и последующая модификация
Есть 2 коллекции ObservableCollection&lt;CollectionItem&gt; CollectionOne и ObservableCollection&lt;CollectionItem&gt; CollectionTwo содержащие по 5...

Как долго будет выполняться сравнение коллекций?
Добрый день! Суть программы такая. Отправляется запрос на сайт, ответ приходит в виде JSON, в котором содержится 100 последних действий,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru