Вычитание списка с индексами
Допустим, у меня есть такой список А:
line value
0 Object0
1 Object1
2 Object2
3 Object3
4 Object4
5 Object5
Теперь у меня есть еще один список B, содержащий [0,2,3]
(только Integer
) который в основном содержит индексы объектов, на которые я уже смотрел.
Я хотел бы получить список C (это индексы [0,1,2,3,4,5]-[0,2,3]=[1,4,5]
):
line value
1 Object1
4 Object4
5 Object5
Кстати: мне нужен оригинальный список, чтобы остаться прежним.
Я мог бы создать список индексов и затем удалить список B, чтобы получить список C, но есть ли простой и эффективный способ получить непосредственно объект?
3 ответа
РЕДАКТИРОВАТЬ: (потому что я забыл, что вы хотите, чтобы оригинальный список не изменился):
Таким образом, операция ONE-LINE полезна:
//I recreate your scenario to test
List<Object> list = new ArrayList<>();
list.add("Object0"); list.add("Object1"); list.add("Object2");
list.add("Object3"); list.add("Object4"); list.add("Object5");
List<Integer> indexesToAvoid = Arrays.asList(0, 2, 3);
Принцип таков: перебирайте свои объекты и сохраняйте те, индекс которых не отображается в indexesToAvoid
, а затем собрать их в new List
:
List<Object> resultList = list.stream()
.filter(obj -> !indexesToAvoid .contains(list.indexOf(obj)))
.collect(Collectors.toList());
Это легко решить с помощью потоков, например:
List<Object> listC = IntStream.range(0, listA.size())
.filter(n -> !listB.contains(n))
.mapToObj(n -> listA.get(n))
.collect(Collectors.toList());
listA
а также listB
остается как есть
Создайте набор индексов от 0 до размера исключительного списка, а затем удалите индексы из другого списка, а затем заполните результирующий список, выбрав объекты по индексам из исходного списка.
Используя ваш пример:
- генерировать
[0,1,2,3,4,5]
задавать - вычитать
[0,2,3]
из набора, в результате чего[1,4,5]
задавать - Для каждого индекса в
[1, 4, 5]
получить объект из списка источников и поместить в результирующий список
Или создайте копию исходного списка и удалите элементы с помощью [0,2,3]
индексы из копии.
Вы также можете рассмотреть возможность изменения структуры данных, которая содержит [0,2,3]
индексы и описать проблему в более общем виде, не постулируя, что [0,2,3]
Список индексов должен быть использован, что может привести к более элегантному и эффективному решению.