数组-2

数组

内容:

  • 一些数组的常规应用
  • 多维数组
  • Arrays工具类

一、一些数组的常规应用

1.元素访问

  • 判断一个元素,在任意数组当中是否存在,如果存在返回该元素所在的游标,如果不存在则为-1

  • 如果存在相同元素,记录第一次出现的元素位置

	/*
		 * 判断一个元素,在任意数组当中是否存在, 如果存在返回改元素所在的游标,如果不存在则为-1
		 */
		// 这是要检查元素的数组
		int[] arr = { 101, 103, 102, 102, 111, 333, 222 };
		// 要有一个比较的值
		int cho = 102;
		// 最终要获取的游标
		int index = -1;
		// 开始比较
		for (int i = 0; i < arr.length; i++) {
			int item = arr[i];
			if (cho == item) {
				index = i;
				break;// 从这里跳出循环
			}
		}
		System.out.println("得到的游标:" + index);

2.队列位移

  • 将某一个元素由队列当中的某个位置,移动到另一个位置

  • 位置交换

//1.交换位置
int[] arr = {0,1,2,3,4,5,6,7,8,9,-1};
int temp = arr[arr.length-1];
arr[arr.length-1] = arr[arr.length-2];
arr[arr.length-2] = temp;
System.out.println(Arrays.toString(arr));


结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, -1, 9]
  • 连续位置交换
//2.连续交换位置
int[] arr = {0,1,2,3,4,5,6,7,8,9,-1};
for(int i = arr.length - 1 ; i > 0 ; i --){
	int temp = arr[i];
	arr[i] = arr[i-1];
	arr[i-1] = temp;
}
System.out.println(Arrays.toString(arr));
  • 数据聚合:最大值,最小值,平均值,总和,总数量
//数据聚合
int[] arr = {0,1,2,3,4,5,6,7,8,9,-1};
int max = arr[0];//最大值
int min = arr[0];//最小值
double avg = 0;//平均值
int sum = 0;//总和
int count = arr.length;//总数量
for(int item : arr){
	sum += item;
	if(item > max){
		max = item;
	}
	if(item < min){
		min = item;
	}
}
//算平均
avg = (double)sum / count;
  • 数组长度改变

改变长度的思路,新建一个新的数组,把原本的数组元素复制过去。

正向扩容:变长

  • 要复制一个新的数组,其长度为原数组长度+要扩容的长度
  • 将数据依次复制到新的数组当中

image

//数据扩容
int[] arr = {0,1,2,3,4,5,6,7,8,9,-1};
//需要扩容的长度
int appendSize = 5;
//新数组长度的公式是:原数组长度+要扩容的长度
int newLength = arr.length + appendSize;
//创建新的数组
int[] newArray = new int[newLength];
//循环赋值,把原数组里的元素赋值给新数组相同的位置
for(int i = 0 ; i < arr.length ; i ++){
	newArray[i] = arr[i];
}
System.out.println(Arrays.toString(newArray));


结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0, 0, 0, 0, 0]

反向扩容:变短

  • 从数组当中移除掉一个元素
  • 最简单的思路就是在要删除的位置,进行连续位移

image

第一步:先完成位移工作

//数据反向扩容
int[] arr = {0,1,2,3,4,-1,5,6,7,8,9};
//确定要删除的元素游标
int deleteIndex = 5;
//从其自身所在位置开始循环
for(int i = deleteIndex ; i < arr.length - 1 ; i ++){
	int nextIndex = i + 1;
	arr[i] = arr[nextIndex];//把下一位移动到我当前位置
}

第二步:进行新数组的创建和元素的赋值

公式:新数组的长度为:原数组长度-1

//新数组的长度为:原数组长度-1
int newLength = arr.length - 1;
int[] newArray = new int[newLength];
//以新数组为标准进行循环
for(int i = 0 ; i < newArray.length ; i ++){
	newArray[i] = arr[i];
}
System.out.println(Arrays.toString(newArray));     

结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

数组扩容所带来的问题

  • 空间的浪费:内存空间
  • 时间的浪费:赋值带来的时间消耗
  • 算力的浪费:运算位移

二、多维数组

在一维数组的基础上,每个元素都保存一个数组,此时该数组变为二维数组
以此类推,数组的维度可以无穷无尽

语法:

//二维数组
类型[][] d2 = new 类型[高维度][低纬度];
//三维数组
类型[][][] d3 = new 类型[高纬度][中纬度][低纬度];

多维数组数据的存取方式

取值:

// 创建二维数组
int[][] d2 = new int[10][5];
System.out.println("高纬度的长度:"+d2.length);
for(int i = 0 ; i < d2.length ; i ++){
	int[] d1 = d2[i];//一维数组
	for(int j = 0 ; j < d1.length ; j++){
		System.out.println("元素内容:"+d1[j]);
	}
}

存值(以游标的方式):

// 创建一个正方形二维数组
int[][] d2 = new int[5][5];
d2[0][0] = 1;
d2[1][1] = 1;
d2[2][2] = 1;
d2[3][3] = 1;
d2[4][4] = 1;

三、Arrays工具类

JDK专门为数组准备的一个工具类
可以参考API文档:https://docs.oracle.com/javase/8/docs/api/

  • API说明

copyof:复制一个数组

//Arrays的API
int[] is1 = {1,2,3,4,5,6};
//一个新的数组
int[] is2 = Arrays.copyOf(is1, is1.length+1);
//复制了一个新的数组,长度+1
System.out.println(Arrays.toString(is1));
System.out.println(Arrays.toString(is2));

结果:
    
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 0]

使用copyof复制的是什么

//Arrays的API
int[] is1 = {1,2,3,4,5,6};
//一个新的数组
int[] is2 = Arrays.copyOf(is1, is1.length);
//复制了一个新的数组,长度+1
System.out.println(Arrays.toString(is1));
System.out.println(Arrays.toString(is2));
//看一看是不是同一个数组
System.out.println(is1 == is2);

结果:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
false
    
    
结论:copyOf是新建了一个新的数组
  • 复制数组

System.arraycopy
参数说明:
src:原数组
srcPos:原数组从哪个位置开始复制
dest:要复制到的数组
destPos:从哪里开始
length:复制的数组元素的长度

//Arrays的API
int[] is1 = {1,2,3,4,5,6};
//一个新的数组
int[] is2 = new int[5];
//复制数组
System.arraycopy(is1, 0, is2, 0, 3);

System.out.println(Arrays.toString(is2));

注意:
System.arraycopy的目的存粹是为了复制数组的元素
其无论是获取要复制的范围,还是复制的数组的范围,都不可以越界

  • 比较数组的元素

​ 对比的主观逻辑:

//在主观上判断他是同一个东西
boolean flag = true;
if(is1.length == is2.length){
	for(int i = 0 ; i < is1.length ; i ++){
		if(is1[i] != is2[i]){
			flag = false;
			break;
		}
	}
}else{
	flag = false;
}
  • equals的用法

为true的情况:两个数组的元素个数相同,对应位置的元素值也相同

//比较数组的元素
int[] is1 = {1,2,3};
int[] is2 = {1,2,3,0};
boolean result = Arrays.equals(is1, is2);
System.out.println(result);
  • 填充初值

    • fill的用法
    //填充初值
    int[] is1 = new int[10];
    //把is1这个数组当中的所有元素,设为1
    Arrays.fill(is1, 1);
    System.out.println(Arrays.toString(is1));
    
  • 数组排序

基于快速排序和归并排序的变种

//数组排序
int[] is1 = {5,4,3,1,2,6,7,9,8,0};
//排序
Arrays.sort(is1);
System.out.println(Arrays.toString(is1));

结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 数组打印

直接打印引用数据类型,打印的是内存地址。

要打印数组的具体内容,需要用到该方法

//数组打印
int[] is1 = {5,4,3,1,2,6,7,9,8,0};
System.out.println(Arrays.toString(is1));
posted @ 2023-03-09 19:42  DFshmily  阅读(14)  评论(0编辑  收藏  举报