要求:
- 不使用for循环
- 不使用API方法进行数据迁移 :
- System.arraycopy(int[] a,…);
- Arrays.copyOf(int[] a,…);
import java.util.Arrays;
/**
* for循环实现 扩容的思想
*/
public class TestArraysUnionAll1 {
public static void main(String[] args) {
int[] a1 = {2,3,5,8,9};
int[] a2 = {2,5,7};
//创建一个足够大的数组
int[] array = new int[a1.length+a2.length];
//先把a1中的元素赋值进去
for (int i = 0; i < a1.length; i++) {
array[i] = a1[i];
}
//再把a2的元素赋值进去,注意下标
for (int i = a1.length; i < array.length; i++) {
array[i] = a2[a2.length-(array.length-i)];
}
//排序
Arrays.sort(array);
//遍历
for (int i : array) {
System.out.print(i+"\t");
}
}
}
要求:不用for循环,不用扩容API
思路 & 代码实现:
/**
* 两个有序数组合并为一个有序数组
* 不能用for循环--读好书---while改造
* 不使用工具类排序--排序的原本面目--比较
* <p>
* 实现思路:
* 1.创建一个能容纳两个数组的数组
* 2.都是有序的,实现最终有序,那就两个数组的元素进行比较。
* 3.有序的往新数组中填充
*/
public class TestArrayUnionAll2 {
public static void main(String[] args) {
int[] a1 = {2, 3, 5, 8, 9};
int[] a2 = {2, 5, 7};
int a = a1.length;
int b = a2.length;
int[] array = new int[a + b];
//定义三个起始变量,分别对应数组a1、a2、array的下标初始值
int i = 0, j = 0, x = 0;
/**
* 开始数据处理
* 什么情况下填充array数组? 0=<i<a 0=<j<b
* 什么顺序? 根据a1、a2数组,是从下到大的
* 什么时候填充a1的元素?什么时候填充a2的元素? 根据下标确定位置比较对应元素的大小 a1元素小放a1的 a2元素小放a2的
*/
while (i < a && j < b) {
if (a1[i] < a2[j]) {
array[x] = a1[i];
x++;
i++;
} else {
array[x] = a2[j];
x++;
j++;
}
}
/**
* 在数据迁移的过程中会出现i>a j>b的情况,此时出现数组下标越界异常,并且超出了上述代码的权限管理范围
* 对于此问题,一旦i>=a 则代表数组a1元素迁移完毕 一旦j>=b 则代表数组a2迁移完毕
* 那么剩下的a2或者a1的元素直接迁移至array即可
*/
//a1先迁移完毕,剩下的a2直接迁移就好了
if (i >= a) {
while (j < b) {
array[x] = a2[j];
x++;
j++;
}
}
//a2先迁移完毕,剩下的a1直接迁移就好了
if (j >= b) {
while (i < a) {
array[x] = a1[i];
x++;
i++;
}
}
//打印数组array
for (int z : array) {
System.out.print(z+"\t");
}
}
}