目标数组:
int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8, 10};
指定开始下标 2 指定结束下标 6
最终的新数组数据存储情况
{5, 7, 19, 2};
分析:
1. 指定下标 2 开始到 6 结束,但是数据结果为 {5, 7, 19, 2}; 表示
数据的截取形式是【要头不要尾】也是 Java 中约定俗成的范围数据要求
2. 指定下标 2 开始到 6 结束,截取之后,新数组的元素个数 4
6 - 2 ==> 4
新数组容量是结尾下标位置 - 开始下标位置
3. 下标数据有合法性要求
开始下标和结束下标必须在合法下标范围以内
开始下标必须小于结束下标。
错误条件:
begin 开始 end 结束
fromIndex 开始下标位置 toIndex 目标下标位置
begin < 0
begin > arr.length - 1
end < 0
end > arr.length - 1
begin > end
核心错误条件:
begin > end
可以利用最小值封底,最大值封顶的方式来约束数据的范围
如果 begin < 0 配合 begin > end 错误条件限制,可以删除 end < 0 约束
b => -2 e => 5 ×
b => -1 e => -5 ×
b => 5 e => -1 ×
b => 2 e => 5 正确
如果 end > arr.length - 1 配合 begin > end 错误条件限制,可以删除 begin > arr.length - 1 约束
4. 尾插法添加数据形式。
需要一个 int 类型变量 count
a. 记录当前数组中有效元素个数
b. 记录存储数据的下标位置。
*/
import java.util.Arrays;
public class Test{
public static void main(String[] args) {
// 源数据数组
int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8, 10};
// 用户指定的开始下标和结束下标
int begin = 2;
int end = 6;
int[] newArr = subArray(arr, begin, end);
System.out.println(Arrays.toString(newArr));
}
/**
* 从指定数组中,指定下标位置开始,到指定下标位置结束,截取新的数组内容
*
* @param arr 用户指定的源数据数组
* @param begin 截取操作开始下标位置
* @param end 截取操作结束下标位置
* @return 截取得到的新数组,如果操作失败,返回 null
*/
public static int[] subArray(int[] arr, int begin, int end) {
// 判断用户提供的下标位置是否合法
if (begin > end || begin < 0 || end > arr.length - 1) {
System.out.println("用户提供的下标数据不合法");
/*
* null 可以看做是空,一般用于告知方法调用者,当前操作没有数据反馈。
* 【后期学习】引用数据类型内容,同时也是一个非常特殊的引用数值。
*/
return null;
}
// 计算得到新数组容量
int newCapacity = end - begin;
// 创建新数组
int[] newArr = new int[newCapacity];
/*
* 1. 计数当前数组中存储有效元素个数
* 2. 记录存储数据的下标位置
*/
int count = 0;
// 利用循环,从指定下标位置 begin 开始到 结束下标 end ,begin <= 范围 < end
for (int i = begin; i < end; i++) {
// 在新数组中存储数据内容
newArr[count++] = arr[i];
}
return newArr;
}
}