Java ArrayList.removeAll(),但是对于索引

时间:2018-03-14 16:44:23

标签: java arraylist

有没有办法做这样的事情:

ArrayList<String>.removeAll(ArrayList<Integer>)

ArrayList<Integer>是我想要删除的索引。我知道我可以遍历索引列表并使用remove(index),但我想知道是否有单命令方式这样做。

我知道如何把这个迭代放到一行,我的问题是,如果有一种方法由oracle实现。

3 个答案:

答案 0 :(得分:5)

您可以使用Stream遍历要删除的索引。但是,请注意首先删除最高指数,以避免移动其他元素以移除位置。

public void removeIndices(List<String> strings, List<Integer> indices)
{
     indices.stream()
         .sorted(Comparator.reverseOrder())
         .forEach(strings::remove);
}

要从String列表中删除,这将有效,请调用正确的remove(int)方法。如果您要在List<Integer>上尝试此操作,则必须在致电remove(E)之前致电.mapToInt(Integer::intValue)来致电forEach

答案 1 :(得分:2)

您可以使用Java 8 Streams。

例如:

IntStream.of(7,6,5,2,1).forEach(i->list.remove(i));

如果索引是List<Integer>,您可以这样做:

indexList.stream().mapToInt(Integer::intValue).forEach(i->list.remove(i));

请注意,我更倾向于使用IntStream而不是Stream<Integer>,因为如果您使用Stream<Integer>作为索引,那么您希望从中删除元素的列表本身一个List<Integer>,调用remove(Integer)将删除其值为Integer的元素,而不是其索引为Integer的元素。

答案 2 :(得分:0)

我仍然收到@rgettman的上述警告。为避免出现警告并确保使用正确的删除方法,可以执行此操作。我知道有些人讨厌lambda,但我认为这比多余的mapToInt

更清晰
    public void removeIndices(List<OtherObject> other, List<Integer> indices)
    {
       indices.stream()
             .sorted(Comparator.reverseOrder())
             .forEach(i->other.remove(i.intValue()));
    }