有没有办法做这样的事情:
ArrayList<String>.removeAll(ArrayList<Integer>)
ArrayList<Integer>
是我想要删除的索引。我知道我可以遍历索引列表并使用remove(index)
,但我想知道是否有单命令方式这样做。
我知道如何把这个迭代放到一行,我的问题是,如果有一种方法由oracle实现。
答案 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()));
}