目录
1、System.arraycopy(被复制的数组名,int x(从下标x开始),新的数组名,int x(开始的位置),int x(复制的长度))
(1)int[] copyOf(复制的数组,int newLength)
(2)int[]copyOfRange(复制的数组,int beging,int end)
1、 void fill(要填充的数组a,要给数组填充的值val)
3、int binarySearch(数组名,查找元素)返回下标,如果未找到,返回负值
4、int[] copyOf(复制的数组,int newLength)
一、数组的合并
1 无序数组的合并:
建立一个新数组合并,新数组的长度是两个数组的长度之和。将达尔戈数组加在第一个后面。
(1)双指针合并:
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7 };
int[] arr2 = {56, 89, 34, 62, 17 };
int[] p = new int[arr1.length+arr2.length];
int[] m = new int[arr1.length+arr2.length];
int maxLength=Math.max(arr1.length,arr2.length);
for (int i = 0; i < maxLength; i++) {
if(i<arr1.length) {
p[i] = arr1[i];
}
if (i<arr2.length) {
p[arr1.length + i] = arr2[i];
}
}
(2).使用两个for循环合并
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7 };
int[] arr2 = {56, 89, 34, 62, 17 };
int[] p = new int[arr1.length+arr2.length];
for(int i=0;i<arr1.length;i++ ){
m[i]=arr1[i];
}
for(int i=0;i<arr2.length;i++ ){
m[i+arr1.length]=arr2[i];
}
2、有序数组的合并: 新数组也是有序的
(1)拉链法:
int [] arr1={1,3,5,9,34};
int [] arr2 ={2,4,6,8,13};
int [] newArr=new int[arr1.length+arr2.length];
int i=0,j=0,k=0;
while(i<arr1.length&& j<arr2.length){
if(arr1[i]<=arr2[j]){
newArr[k++]=arr1[i++];
}else {
newArr[k++]=arr2[j++];
}
}
while(i<arr1.length){
newArr[k++]=arr1[i++];
}
while(i<arr2.length){
newArr[k++]=arr2[j++];
}
二、数组的复制:
1、System.arraycopy(被复制的数组名,int x(从下标x开始),新的数组名,int x(开始的位置),int x(复制的长度))
System.arraycopy(arr1,2,newArr,3,arr1.5);//将arr1数组从下标为2开始截取5个长的的值,复制到newArr数组从下标3开始
2 使用Arrays下面的两个方法:
(1)int[] copyOf(复制的数组,int newLength)
(2)int[]copyOfRange(复制的数组,int beging,int end)
//int[] copyOf(复制的数组,int newLength)
//如果newLength超过要复制的数组的长度,其余元素用默认值填充
// 在复制过程中,从下标为0的位置开始复制
int[] arr2 ={1,2,3,4,5};
int[] newArr1 = Arrays.copyOf(arr2,7);
System.out.println(Arrays.toString(newArr1));
//int[]copyOfRange(复制的数组,int beging,int end)
// 如果end超过了要复制的数组的下标,则用数组的默认值填充
int[]copyArr = Arrays.copyOfRange(arr2,2,6);
System.out.println(Arrays.toString(copyArr));
三、数组乱序(洗牌算法)
数组乱序,也被称为数组洗牌,实现算法中有一个非常著名的洗牌算法Fisher-Yates
算法,是由 Ronald
A.Fisher
和Frank Yates
于1938
年发明的,后来被Knuth
在自己的著作《The Art of Computer Programming
》中介绍,很多人直接称Knuth
洗牌算法。
-
假设有一组等待乱序的数组
P
-
从
P
中随机选取一个未乱序的元素 -
将
该元素
与数组P中最后一个未乱序
的元素交换 -
重复
2
-3
的步骤,直到数组P
中元素全部完成乱序//数组乱序,洗牌算法 //每次那最后一个元素和随机生成的下标位置的元素交换(随机位置小于交换位置) int[] arr={1,2,3,4,5,6,7,8,9}; for(int i=arr.length-1;i>=0;i--){ //找随机下标 从后往前 int random=(int)(Math.random()*i); //交换 int temp=arr[i]; arr[i]=arr[random]; arr[random]=temp; } System.out.println(Arrays.toString(arr));
四、数组的旋转
1、右旋:
2、左旋:
//旋转
//右旋
int [] arr={1,2,3,4,5,6,7,8,9};
int [] arr1={1,2,3,4,5,6,7,8,9};
System.out.println("原数组:"+Arrays.toString(arr));
for (int i = arr.length - 1; i >0; i--) {
arr[i] = arr[i] ^ arr[i - 1];
arr[i - 1] = arr[i] ^ arr[i - 1];
arr[i] = arr[i] ^ arr[i - 1];
}
System.out.println("右旋:"+Arrays.toString(arr));
for(int i=0;i<arr1.length-1;i++){
arr1[i]=arr1[i]^arr1[i+1];
arr1[i+1]=arr1[i]^arr1[i+1];
arr1[i]=arr1[i]^arr1[i+1];
}
System.out.println("右旋:"+Arrays.toString(arr1));
五、Arrays的常用方法
1、 void fill(要填充的数组a,要给数组填充的值val)
int[] arr=new int[100];
Arrays.fill(arr,2);//都填充为2
System.out.println(Arrays.toString(arr));
// void fill(要填充的数组a,要填充的起始位置,结束位置-1,要给数组填充的值val)
Arrays.fill(arr, 1,4,5);
System.out.println(Arrays.toString(arr));
2、void sort(要排序的数组)整型默认升序排序
void sort(要排序的数组)整型默认升序排序
void sort(要排序的数组,起始下标,结束下标)整型默认升序排序
Arrays.sort(arr); Arrays.sort(arr,1, 5); System.out.println(Arrays.toString(arr));
3、int binarySearch(数组名,查找元素)返回下标,如果未找到,返回负值
int[] arr1={1,2,4,5,6,7,8}; //int index=Arrays.binarySearch(arr,7); // System.out.println(index); //限定二分查找元素的范围,从beign~end-1 int index = Arrays.binarySearch(arr1, 1, 4, 5); System.out.println(index);
4、int[] copyOf(复制的数组,int newLength)
//如果newLength超过要复制的数组的长度,其余元素用默认值填充 // 在复制过程中,从下标为0的位置开始复制 int[] arr2 ={1,2,3,4,5}; int[] newArr1 = Arrays.copyOf(arr2,7); System.out.println(Arrays.toString(newArr1)); //int[]copyOfRange(复制的数组,int beging,int end) // 如果end超过了要复制的数组的下标,则用数组的默认值填充 int[]copyArr = Arrays.copyOfRange(arr2,2,6); System.out.println(Arrays.toString(copyArr));
六、二维数组
1、动态初始化:
数据类型[ ][ ] 数组名=new 数据类型[长度] [ ] : int[ ][ ] arr1 =new int[3][ ];
int[][] arr1 =new int[3][4];
//取值
System.out.println("元素一:"+ Arrays.toString(arr1[0]));//元素一:[0, 0, 0, 0]
System.out.println("元素二:"+ Arrays.toString(arr1[1]));//元素二:[0, 0, 0, 0]
System.out.println("元素三:"+ (arr1[2]));元素三:[I@1b6d3586 打印的地址
//赋值
int[] ns1={1,2,3,4};
arr1[0]=ns1;
arr1[1]=new int[]{5,5,5};
arr1[2]=new int[0];
//重新赋值后
System.out.println("元素一:"+ Arrays.toString(arr1[0]));//[1, 2, 3, 4]
System.out.println("元素二:"+ Arrays.toString(arr1[1]));//[5, 5, 5]
System.out.println("元素三:"+ Arrays.toString(arr1[2]));//[]
2、静态初始化:
数据类型[ ][ ] 数组名=new 数据类型[ ] [ ]{数组类型元素一,数组类型元素二、数组类型元素三、...}
int[][] arr1 =new int[][]{{1,2,3},null,{8,9}};
3、静态省略初始化:
数据类型[ ][ ] 数组名={数组类型元素一,数组类型元素二、数组类型元素三、...}
int[][] arr1 ={{1,2,3},null,{8,9}};
六、二维数组的遍历
1、双重for循环
//for循环
for (int i = 0; i < arr.length ; i++) {
for (int j = 0; j <arr[i].length ; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
2、foreach 循环
//foreach
for (int[] temp: arr) {
for (int number:temp){
System.out.print(number+" ");
}
System.out.println();
}
3、将二维数组转成字符串遍历:
System.out.println(Arrays.deepToString(arr));