Например у меня есть:
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList first = new LinkedList(); // first = ['A', 'B', 'B', 'A']
LinkedList second = new LinkedList(); // second = ['B', 'A']
}
}
Мне нужно удалить все элементы из первого списка, которые есть во втором. В конце должно получиться:
first = ['A', 'B'],
second = [] или second = ['B', 'A']
Но при этом желательно не использовать цикл. Это возможно сделать или я слишком много прошу?
Пройтись в цикле и удалить встреченные элементы:
LinkedList first = new LinkedList(); // first = ['A', 'B', 'B', 'A']
first.addAll(Arrays.asList("A", "B", "B", "A"));
LinkedList second = new LinkedList(); // second = ['B', 'A']
second.addAll(Arrays.asList("B", "A"));
for (Object o : second) {
first.remove(o);
}
System.out.println(first); // [B, A]
Вместо цикла можно использовать конструкцию из streams-api (@Russtam, спс за подсказку):
second.forEach(first::removeFirstOccurrence);
System.out.println(first); // [B, A]
Сначала будет удалена первая попавшаяся B (['A', 'B', 'A']), после A (['B', 'A'])
int index = Collections.indexOfSubList(first, second);
if (index!=-1) {
List<String> list1 = first.subList(0, index);
List<String> list2 = first.subList(index + second.size(), first.size());
list1.addAll(list2);
first = list1;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости