Уменьшить количество элементов в списке Java с помощью потоков Java8

#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:

Простой подход:

  1. Создайте список результатов и инициализируйте его как пустой.
  2. Выполните итерацию по списку входных данных. Для каждого входного элемента:
    1. Найдите все элементы в результирующем списке, которые содержат либо идентификатор, либо сайт (или оба) из входного элемента.
    2. Объедините (уменьшите) их в один элемент списка результатов.
    3. Также добавьте элемент ввода.

Используйте классический цикл, без потоковой операции.