You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除指定元素后,如何高效实现ArrayList的循环重排?

问题:ArrayList循环重排的高效实现方式?

需求:对ArrayList进行循环重排,排序规则是从被移除元素的下一个元素开始依次排列。示例:原ArrayList为[obj1, obj2, obj3, obj4],移除obj2后,剩余列表需排列为[obj3, obj4, obj1]。

已尝试的双变量for循环实现:

for(int i=list.indexOf(obj), k=0 ; k<list.size()-1; k++)
{
    if (i==giocatori.size()) i=0;
    else i++;
    remainingList.add(List.get(i));
}

请问是否存在更高效的实现方式?

更高效的实现方式

你的现有实现存在两处可优化点:一是list.indexOf(obj)会遍历列表查找元素,时间复杂度O(n);二是循环中逐个添加元素,频繁扩容可能影响性能。以下是两种更高效的实现思路:

1. 利用subList+addAll批量操作

找到目标元素的索引index后,直接通过子列表批量添加元素,避免循环逐个操作:

int index = list.indexOf(obj);
// 先添加被移除元素的下一个到列表末尾的所有元素
remainingList.addAll(list.subList(index + 1, list.size()));
// 再添加列表开头到被移除元素前的所有元素
remainingList.addAll(list.subList(0, index));

这种方式时间复杂度仍为O(n),但减少了循环中的多次方法调用和潜在的列表扩容次数,实际执行效率比循环逐个add更高。

2. 直接使用已知索引(最优情况)

如果已经提前知道目标元素的索引,无需调用indexOf查找,直接用上述批量操作,能省去O(n)的查找时间,这是性能最优的场景。

边界处理

若目标元素不在原列表中,indexOf会返回-1,此时可直接将原列表的所有元素复制到新列表,或者根据业务需求做特殊处理。

内容的提问来源于stack exchange,提问作者MaFiore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:07:46