在Java开发中,按指定步长重排列表元素是一个常见的集合操作需求,比如我们需要将一个顺序列表按照每隔n个元素取一个的方式重新排列,生成新的列表结构。这种算法在数据处理、任务调度等场景中都有实际应用,下面我们就来详细讲解实现方法。

核心实现思路
按指定步长重排列表的核心逻辑是遍历原列表时,按照设定的步长间隔选取元素,依次放入新列表中。具体可以分为几个步骤:首先校验输入的列表和步长参数是否合法,避免空指针或无效步长导致的异常;然后从列表的第一个元素开始,每次索引增加步长,将对应位置的元素加入结果列表;当索引超过原列表长度时,停止遍历即可。
完整代码实现
下面是使用Java实现该算法的完整代码,包含参数校验和边界情况处理:
import java.util.ArrayList;
import java.util.List;
public class ListRearrangeByStep {
/**
* 按指定步长重排列表元素
* @param originalList 原列表,不能为空
* @param step 步长,必须大于0
* @return 重排后的新列表
*/
public static <T> List<T> rearrangeByStep(List<T> originalList, int step) {
// 参数校验
if (originalList == null || originalList.isEmpty()) {
throw new IllegalArgumentException("原列表不能为空");
}
if (step <= 0) {
throw new IllegalArgumentException("步长必须大于0");
}
// 初始化结果列表
List<T> resultList = new ArrayList<>();
// 按步长遍历原列表
for (int i = 0; i < originalList.size(); i += step) {
resultList.add(originalList.get(i));
}
return resultList;
}
// 测试示例
public static void main(String[] args) {
List<Integer> testList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
testList.add(i);
}
System.out.println("原列表:" + testList);
// 步长为2重排
List<Integer> resultStep2 = rearrangeByStep(testList, 2);
System.out.println("步长为2重排后:" + resultStep2);
// 步长为3重排
List<Integer> resultStep3 = rearrangeByStep(testList, 3);
System.out.println("步长为3重排后:" + resultStep3);
}
}
代码说明与效果演示
上述代码中,rearrangeByStep方法是一个泛型方法,可以处理任意类型的列表。首先做了两个参数校验:如果原列表为空或者步长小于等于0,就抛出非法参数异常,避免后续运行出错。然后通过for循环,初始索引为0,每次循环索引增加步长,将对应位置的元素加入结果列表,直到索引超过原列表的长度。
用测试代码中的原列表[1,2,3,4,5,6,7,8,9,10]来测试:
- 步长为2时,会依次取索引0、2、4、6、8的元素,结果为[1,3,5,7,9]
- 步长为3时,会依次取索引0、3、6、9的元素,结果为[1,4,7,10]
算法复杂度分析
该算法的时间复杂度为O(n/step),其中n是原列表的长度,因为只需要遍历原列表的一部分元素。空间复杂度为O(n/step),需要额外开辟一个结果列表来存储重排后的元素,没有使用额外的复杂数据结构,整体效率比较高,适合处理中等规模的列表数据。
扩展场景说明
如果需要实现循环步长重排,比如步长超过列表长度后从头部继续取元素,只需要在索引超过列表长度时,对索引取原列表长度的模即可,修改遍历逻辑为int index = i % originalList.size();,就可以实现循环取元素的效果,开发者可以根据实际需求调整逻辑。