有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带索引的java列表减法

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

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列表,但是有没有一种简单有效的方法直接获取对象


共 (3) 个答案

  1. # 1 楼答案

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

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

    listAlistB保持原样

  2. # 2 楼答案

    编辑:(因为我忘了您不希望更改原始列表):
    因此,单行操作是有用的:

    //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());
    
  3. # 3 楼答案

    生成一组从0到列表大小的索引,然后从另一个列表中删除索引,然后通过从原始列表中按索引选择对象来填充结果列表

    以您的例子:

    1. 生成[0,1,2,3,4,5]
    2. 从产生[1,4,5]集的集合中减去[0,2,3]
    3. 对于[1, 4, 5]中的每个索引,从源列表中获取对象并放入结果列表中

    或者,创建原始列表的副本,并从副本中删除具有[0,2,3]索引的元素

    您可能还需要考虑改变包含^ {< CD2>}索引的数据结构,并以更一般的方式描述问题,而不必假定使用索引{^ }索引列表,这可能会导致更优雅和高效的解决方案。p>