根据另一个列表中的项目从列表中删除项目

时间:2014-12-09 17:33:16

标签: java

假设我有一个名为ArrayList的{​​{1}} Child个对象。

children

现在我有一个整数列表,它是ArrayList<Child> children = new ArrayList<>(data); 中儿童的一些索引。

children

删除List<Integer> items = new ArrayList<>(data2); 中具有与children中的整数匹配的索引的items中所有子项的最有效方法是什么?

5 个答案:

答案 0 :(得分:3)

您可以创建要删除的对象列表,然后使用ArrayList的removeAll()方法。

尝试这样的事情:

ArrayList<Child> toRemove = new ArrayList<>();

for (int i = 0; i < items.size(); i++) {
    toRemove.add(children.get(items.get(i)));
}

children.removeAll(toRemove);

希望这有帮助。

答案 1 :(得分:2)

如果没有对项目进行排序(首先是更高的值):Collections.sort(items, Collections.reverseOrder());

然后:

for (Integer i : items) {
    children.remove(i);
}

答案 2 :(得分:1)

最好的方法是创建一个包含通过条件的元素的新列表。

答案 3 :(得分:1)

作为aurelianus上述答案的替代方案,考虑您的用例:

对items数组进行排序,然后按索引的降序从子数组中删除Child对象。

成本考虑因素:

  • 对索引列表进行排序 - 取决于要删除的索引数量是否值得关注。
  • 对于删除的每个Child对象,具有较高索引的所有子项在后备数组中移位一。我怀疑这是通过System.arraycopy()完成的,这将非常有效。不过,成本随着要删除的元素数量和索引较高的子女数量而增加。
  • 内存已就地使用。

答案 4 :(得分:1)

支持创建一个新的,已过滤的列表并将旧列表视为不可变的,以下是在Java 8中如何做到这一点:

List<Child> collect = IntStream.range(0, children.size())
            .filter(i -> !items.contains(i))
            .mapToObj(children::get)
            .collect(Collectors.toList());