Вычитание списка с индексами

Допустим, у меня есть такой список А:

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 до размера исключительного списка, а затем удалите индексы из другого списка, а затем заполните результирующий список, выбрав объекты по индексам из исходного списка.

Используя ваш пример:

  1. генерировать [0,1,2,3,4,5] задавать
  2. вычитать [0,2,3] из набора, в результате чего [1,4,5] задавать
  3. Для каждого индекса в [1, 4, 5] получить объект из списка источников и поместить в результирующий список

Или создайте копию исходного списка и удалите элементы с помощью [0,2,3] индексы из копии.

Вы также можете рассмотреть возможность изменения структуры данных, которая содержит [0,2,3] индексы и описать проблему в более общем виде, не постулируя, что [0,2,3] Список индексов должен быть использован, что может привести к более элегантному и эффективному решению.

Другие вопросы по тегам