列出具有索引的减法

时间:2017-07-12 09:23:45

标签: java list loops set-difference

假设我有一个类似的列表A:

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

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

我想获得List C(它是索引[0,1,2,3,4,5]-[0,2,3]=[1,4,5]):

line value
1    Object1
4    Object4
5    Object5
顺便说一句:我需要原始列表保持不变。

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

3 个答案:

答案 0 :(得分:2)

使用流很容易解决,例如:

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

listAlistB保持原样

答案 1 :(得分:1)

编辑:(因为我忘记你原来的名单没有改变):
因此 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());

答案 2 :(得分:1)

生成一组从0到列表独有的索引,然后从另一个列表中删除索引,然后按原始列表中的索引选择对象填充结果列表。

使用您的示例:

  1. 生成[0,1,2,3,4,5]设置
  2. 从集合中减去[0,2,3],结果为[1,4,5] set
  3. 对于[1, 4, 5]中的每个索引,从源列表中获取对象并放入结果列表
  4. 或者创建原始列表的副本,并从复制中删除带有[0,2,3]索引的元素。

    您可能还需要考虑更改包含[0,2,3]索引的数据结构并以更一般的方式描述问题,而不假设必须使用[0,2,3]索引列表,这可能会导致更多优雅高效的解决方案。