Java List 有一个方法可以在一个位置添加多个元素,但我找不到删除一个位置的多个元素的方法

Java List has a method to add multiple elements at a position, but I can't find a method to remove multiple elements at a position

提问人:Markus 提问时间:10/26/2023 最后编辑:khelwoodMarkus 更新时间:10/27/2023 访问量:104

问:

有,但我找不到相应的,无论措辞和方式如何指定。在 中,有 ,但不在 中。List.addAll(position, collection)List.<remove>(position, <range>)ArrayListremoveRange(position, positionAfter)List

在许多列表类型中,从列表中删除间隔可以是 O(1),逐个删除元素将是 O(n) 并错过该功能。将一般转换为支持范围删除的类型也将是 O(n) 并错过机会。List

有没有办法从一般值中删除一系列值,以实现可以为此进行优化?ListList

Java 列表 集合

评论

0赞 Mark Rotteveel 10/26/2023
你的问题是什么?现在你刚刚陈述了一个事实,即界面没有东西,你是对的,它没有。List
1赞 Sweeper 10/26/2023
List确实没有.你到底在问什么?请注意,“为什么不是某种方式”不是一个好问题。removeRange
0赞 dan1st 10/26/2023
您也可以使用然后从那里删除。这样做的复杂性可能因您的实现而异(由于您的问题现已关闭,我无法将其发布在答案中)。listIterator(startIndex)List
0赞 Andy Turner 10/26/2023
@dan1st但这不是删除多个项的好方法,因为每个删除都是独立完成的,这在从 ArrayList 的开头/中间删除的情况下效率低下,因为所有元素都向下移动了多次。 只执行一个班次,无论您删除多少元素。subList(...).clear()
0赞 dan1st 10/26/2023
@AndyTurner这取决于您正在使用的列表。例如,对于 ,这将节省查找每次导航到要删除的元素的成本。 很棒,但可能有一些特定的列表(尤其是自定义实现)不能很好地优化。这完全取决于您正在处理的列表类型。LinkedListsubList().clear()List

答:

10赞 khelwood 10/26/2023 #1

List#subList

该方法返回列表子范围的视图,由相同的数据支持:对子列表所做的更改将反映在原始列表中。ListsubList

因此,您可以使用并从可变列表中删除元素块:subListclear

>>> List<Integer> values = new ArrayList<>(List.of(10,20,30,40,50,60));
values ==> [10, 20, 30, 40, 50, 60]
>>> values.subList(3,5).clear()
>>> values
values ==> [10, 20, 30, 60]
0赞 dan1st 10/26/2023 #2

由于可能有些列表没有像 khelwood 所描述的那样使用 subList 实现有效删除,因此在这种情况下可以使用迭代器。其时间复杂度可能因列表实现而异。

List<T> yourList = ...;//TODO
Iterator<T> it = yourList.listIterator(yourStartIndex);
for(int i=0; i<numberOfElementsToRemove && it.hasNext(); i++){
    it.next();
    it.remove();
}

在这里,该方法在要开始的位置创建一个。List#listIterator(int)ListIterator

在那里,它会删除您要删除的任意数量的元素。这可能不会带来最佳性能,但它不需要查找每个元素的位置来单独删除。