带索引的列表减法
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 个对象填充结果列表。
使用你的例子:
- 生成
[0,1,2,3,4,5]
集
- 从集合中减去
[0,2,3]
得到 [1,4,5]
集合
- 对于
[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());
listA
和 listB
保持原样
假设我有一个这样的列表 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 个对象填充结果列表。
使用你的例子:
- 生成
[0,1,2,3,4,5]
集 - 从集合中减去
[0,2,3]
得到[1,4,5]
集合 - 对于
[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());
listA
和 listB
保持原样