带索引的列表减法

List substraction with indices

假设我有一个这样的列表 A:

line value
0    Object0
1    Object1
2    Object2
3    Object3
4    Object4
5    Object5

现在,我有另一个包含 [0,2,3](仅 Integer)的列表 B,它基本上包含我已经看过的对象的索引。

我想要列表 C(它是索引 [0,1,2,3,4,5]-[0,2,3]=[1,4,5]):

line value
1    Object1
4    Object4
5    Object5

顺便说一句:我需要原始列表保持不变。

我可以创建索引列表,然后删除 B 列表以获取 C 列表,但是有没有简单有效的方法直接获取对象?

编辑:(因为我忘记了您不希望更改原始列表):
所以 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());

生成一组从 0 到列表独占大小的索引,然后从另一个列表中删除索引,然后使用原始列表中的索引通过 select 个对象填充结果列表。

使用你的例子:

  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] 索引列表,这可能会导致更优雅和高效的解决方案。

用流很容易解决,例如:

    List<Object> listC = IntStream.range(0, listA.size())
            .filter(n -> !listB.contains(n))
            .mapToObj(n -> listA.get(n))
            .collect(Collectors.toList());

listAlistB 保持原样