#java #java-8 #java-stream
#java #java-8 #java-stream
Вопрос:
У меня есть список Java, который содержит элементы, подобные приведенным ниже:
Имя входного списка — ItemsList:
List<Items> itemsList ;
Класс элементов:
List<String> Identifier;
List<String> websites;
Входные элементы для списка:
Identifier websites
id1,id2 site1
id2,id3 site3
id5 site5
id1 site6
id5 site7
id6 site8
Список результатов:
Identifier websites
id1,id2,id3 site1,site3,site6
id5 site5,site7
id6 site8
Как вы можете видеть из результата :
Идентификатор должен быть сгруппирован вместе, если какой-либо идентификатор присутствует в другой строке, и все веб-сайты также должны быть объединены вместе
Вот что я попробовал :
itemsList.stream().reduce((v1, v2) ->
{
//see if identofier overlaps
if (!Collections.disjoint(v1.getIdentifier(), (v2.getIdentifier()))) {
v1.getIdentifier().addAll(v2.getIdentifier());
v1.getwebsites().addAll(v2.getwebsites());
}
return v1;
});
мое решение не очень помогает..Поскольку это уменьшает только первую строку.
Я знаю, что это непростая задача.
Комментарии:
1. Я читаю ваш ввод как
id1 -> site1, site2
,id2 -> site1, site2
а затем : объединениеid1
иid2
. Это правильно?2. но откуда вы знаете, что id1 и id2 должны быть объединены, потому что теперь: id1 -> site1, site2, id2 -> site1, site2, идентификаторы должны быть в другой строке, чтобы их можно было объединить. если они разделены как 1 идентификатор на строку, соединение невозможно правильно
3. Отношение между идентификаторами и сайтами много к одному .. извините, я обновил свои входные данные в вопросе.
4. Они скорее кажутся «многие ко многим». Я не продумал это, но моя непосредственная идея заключается в том, что потоки плохо подходят для этого.
5. @Coder123, извините, я имел в виду объединение-поиск.
Ответ №1:
Простой подход:
- Создайте список результатов и инициализируйте его как пустой.
- Выполните итерацию по списку входных данных. Для каждого входного элемента:
- Найдите все элементы в результирующем списке, которые содержат либо идентификатор, либо сайт (или оба) из входного элемента.
- Объедините (уменьшите) их в один элемент списка результатов.
- Также добавьте элемент ввода.
Используйте классический цикл, без потоковой операции.