本文作为另一篇博文的练习题

以下所用到所有知识点在《【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));

 
❷ 利用工具类ArrayscopyOf 方法进行改进 :

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】数组与集合的美妙转换——全面总结[数组][集合]及其[工具类] 》有讲解

☑ 转载注明作者、出处

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐