【Java】数组合并的多种实现
▊此文章是另一篇《【Java】数组操作详解>_<》的练习 ☀以下所用到所有知识点在上面的博文中都有详细分类与介绍 Integer[] arr1 = { 2, 3, 5 };Integer[] arr2 = { 8, 13 };Q01 :要求合并后数组类型不变,命名为arr3 ❶ 数组的合并其实是数组的定位复制...
☀ 本文作为另一篇博文的练习题
☀ 以下所用到所有知识点在《【Java】数组与集合的美妙转换——全面总结[数组][集合]及其[工具类]》中都有详细分类与介绍
Integer[] arr1 = {2, 3, 5};
Integer[] arr2 = {8, 13};
Q01 :要求合并后数组类型不变,命名为arr3
❶ 数组的合并其实是数组的定位复制(arraycopy内部方法) :
Integer[] arr3 = new Integer[arr1.length + arr2.length];
System.arraycopy(arr1, 0, arr3, 0, arr1.length);
System.arraycopy(arr2, 0, arr3, arr1.length, arr2.length);
// 打印
System.out.println(Arrays.toString(arr3));
❷ 利用工具类Arrays的 copyOf 方法进行改进 :
Integer[] arr3 = Arrays.copyOf(arr1, arr1.length + arr2.length);
System.arraycopy(arr2, 0, arr3, arr1.length, arr2.length);
// 打印
System.out.println(Arrays.toString(arr3));
※ 利用Arrays.copyOf的完全覆盖的特点,将初始化长度与复制arr1合并为一行
❸ 遍历的方法(C风格的思路)
Integer[] arr3 = new Integer[arr1.length + arr2.length];
for(int i = 0 ; i < arr1.length ; i++) {
arr3[i] = arr1[i];
}
for(int i = 0 ; i < arr2.length ; i++) {
arr3[i + arr1.length] = arr2[i];
}
// 打印
System.out.println(Arrays.toString(arr3));
❹ 转换成集合,合并后转化回数组的经典操作(★)
List<Integer> list = new ArrayList<Integer>(Arrays.asList(arr1));
list.addAll(Arrays.asList(arr2));
Integer[] arr3 = list.toArray(new Integer[list.size()]);
System.out.println(Arrays.toString(arr3));
Q02 :【附加题】
Integer[] arr1 = {2, 3, 3, 5};
Integer[] arr2 = {5, 8, 13};
要求合并后数组类型不变,命名为arr3,且元素不可重复
❶ 遍历(C风格)
基本思路新建一个Integer[]数组,将arr1和arr2的元素检查后加入数组或舍弃
这时出现了第一个问题 :不对重复性做要求时,数组的长度确定;而此时我们无法确定数组的最终长度。
数组没有集合那样的动态,当然我们可以假定一个足够大的长度,之后arraycopy到一个适当长的数组
第二个问题 :在检查一个即将插入的元素时候已经存在时,需要进行判断。
这个判断如果自己写的话(C的思路),又需要一次遍历
或许我们可以使用Arrays.binarySearch方法,根据返回值得正负判断数组是否存在该元素。
然而,这有一个雷区 :
对于此题来说,要求数组类型为Integer;我们需要预先初始化其维数(这个维数是足够大的),因此初始化时会有默认值null,在使用Arrays.binarySearch方法时会踩雷:
Arrays.binarySearch如何进行比较的呢?
binarySearch->binarySearch0->compareTo(Integer)->compare(int)
compareTo(compare)企图进行与null的比较时,会报空指针异常(NullPointerException);
另注 :而equals可以传入null值
对于上面的问题,将数组类型设置为int[],默认值为0而非null,可以规避空指针异常
但这有引出了第三个问题 : 基本数据类型数组与包装类类型数组的转化;要知道,企图转化数组类型可不是一件容易的事情
※ 上面的内容你大可不必弄清楚,只需要知道这是一个馊主意
❷ 利用Set集合
Set 集合有着一个我们恰恰需要的的特性,元素独一无二,自动进行检查
写一个内部方法 :
public static Integer[] union(Integer[] a, Integer[] b) {
Set<Integer> set = new HashSet<Integer>();
set.addAll(Arrays.asList(a));
set.addAll(Arrays.asList(b));
return set.toArray(new Integer[set.size()]);
}
调用它 :
Integer[] arr3 = union(arr1, arr2);
System.out.println(Arrays.toString(arr3));
※ 由于Set是不在意顺序的,因而在最后可以 Arrays.sort 一下,确保万无一失
☑ 本文所涉及内容均在《【Java】数组与集合的美妙转换——全面总结[数组][集合]及其[工具类] 》有讲解
☑ 转载注明作者、出处
更多推荐
所有评论(0)