假设我有一个类似的列表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列表但是有一种简单有效的方法来直接获取对象吗?
答案 0 :(得分:2)
使用流很容易解决,例如:
List<Object> listC = IntStream.range(0, listA.size())
.filter(n -> !listB.contains(n))
.mapToObj(n -> listA.get(n))
.collect(Collectors.toList());
listA
和listB
保持原样
答案 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到列表独有的索引,然后从另一个列表中删除索引,然后按原始列表中的索引选择对象填充结果列表。
使用您的示例:
[0,1,2,3,4,5]
设置[0,2,3]
,结果为[1,4,5]
set [1, 4, 5]
中的每个索引,从源列表中获取对象并放入结果列表或者创建原始列表的副本,并从复制中删除带有[0,2,3]
索引的元素。
您可能还需要考虑更改包含[0,2,3]
索引的数据结构并以更一般的方式描述问题,而不假设必须使用[0,2,3]
索引列表,这可能会导致更多优雅高效的解决方案。