Day08

1.多维数组的打印方式
int[][] arr = new int[4][3];//地址值
System.out.println(arr[0]);//地址值
System.out.println(arr[0][0]);//0

!!!System.out.println(arr);//[[地址值二维数组!!!很重要知识。
System.out.println("*********************");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//地址值
System.out.println(arr[0][0]);//0.0

System.out.println("*********************");

String[][] arr2 = new String[4][2];
!!!System.out.println(arr2[1]);//地址值!!!很重要
System.out.println(arr2[1][1]);//null

System.out.println("*********************");
String[][] arr3 = new String[4][];
! ! !System.out.println(arr3[1]);//null! ! !很重要入动态赋值只设置前面的类型就是null! ! !
System.out.println();
int[][] arr1 = new int[4][];
arr1[1] = new int[]{1,2,3};
arr1[2] = new int[4];
arr1[2][1] = 30;//! ! !最重要的点就是会更改[2][1]arr1角标为[2]的值中该变下标为1[0,0,0,0]  [0,30,0,0]改变为30即可。
可以自己动手尝试进行代码的测试,奥妙尽在其中,结合我的注解便可理解。
//这个计算二维数组的总和
public class ArrayExer1 {

	public static void main(String[] args) {
		int[][] arr = new int[][] {{3,5,8},{12,9},{7,0,6,4}};
		
		int sum = 0;//记录总和
		for(int i = 0;i < arr.length;i++) {
			for(int j = 0;j < arr[i].length;j++) {
				sum += arr[i][j];
			}
		}
		System.out.println("总和为:"+ sum);
	}
}
//下面是实操中如何使用数组的方式归纳为以下4点
一、数组元素的赋值(杨辉三角、回形数等)
/*
 * 练习:
    杨辉三角:
    使用二维数组打印一个10行杨辉三角
	【提示】
	1.第一行有1个元素,第n行有n个元素
	2.每一行的第一个元素和最后一个元素都是1
	3.从第三行开始,对于非第一个元素和最后一个元素的元素。即:
	yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];

 *  yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i -1]
 * */
public class YangHuiTest {
    
	public static void main(String[] args) {
		//1.声明并初始化二维数组
	    int[][] yangHui = new int[10][];
	    
		//2.给数组的元素赋值
	    for(int i = 0;i < yangHui.length;i++) {
	    	    yangHui[i] = new int[i + 1];//值杨辉三角用第一行有一个元素
	    	    
	    	    //2.1给首末元素赋值
	    	    yangHui[i][0] = yangHui[i][i] = 1;
	    	    //2.2给每行的非首末元素赋值
	    	    //if(i > 1) {
	    	    	   for(int j = 1;j < yangHui[i].length - 1;j++) {
	    	    		   yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
	    	    //}
	    } 	
	}
	  //3.遍历二维数组		
	    for(int i = 0;i < yangHui.length;i++) {
	    	  for(int j = 0;j < yangHui[i].length;j++) {
	    		  System.out.print(yangHui[i][j] + " ");
	    	  }
	    	  System.out.println();
	    }
   }
}
2.求数值型数组中元素的最大值、最小值、平均数、总和等(用到了随机数的使用:(int)(Math.rendom()* (99 - 10 + 1) + 10);
public class ArrayTest1 {
   
	public static void main(String[] args) {
		 int[] arr = new int[10];
		 
		 for(int i = 0;i < arr.length;i++) {
			 arr[i] = (int)(Math.random()* (99 - 10 + 1) + 10);
		 }
		 //遍历
		 for(int i = 0;i < arr.length;i++) {
			 System.out.print(arr[i] + "\t");
		 }
		 //求数组元素的最大值
		 int maxValue = arr[0];
		 for(int i = 1;i < arr.length;i++) {
			 if(maxValue < arr[i]) {
				 maxValue = arr[i];
			 }
		 }
		 System.out.println("最大值为: " + maxValue);
		 
		//求数组元素的最小值
		 int minValue = arr[0];
		 for(int i = 1;i < arr.length;i++) {
			 if(minValue > arr[i]) {
				 minValue = arr[i];
			 }
		 }
		 System.out.println("最小值为: " + minValue);
		 //求数组元素的总和
		 int sum = 0;
		 for(int i = 0;i < arr.length;i++) {
			 sum += arr[i];
		 }
		 System.out.println("总和为 :" + sum);
		 //求数组元素的平均数
		 int avgValue = sum / arr.length;
		 System.out.println("平均数为: " + avgValue);
	}
	
}
3.数组的复制、反转、查找(线性查找、二分法查找)
/*
(1)创建一个名为ArrayExer2的类,在main()方法中声明array1和array2两个变量,
他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
(如array[0]=0,array[2]=2)。打印出array1。

思考:!!!array1和array2是什么关系?array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体!!!//重点使用叹号标注
拓展:修改题目,实现array2和array1数组的复制
 * */
public class ArrayExer2 {

	public static void main(String[] args) { //alt + /
		int[] array1,array2;
		
		array1 = new int[] {2,3,5,7,11,13,17,19};
		
		//显示array1的内容
		for(int i = 0;i < array1.length;i++) {
			System.out.print(array1[i] + "\t");//打印array1内容
		}
		
		//赋值arrary2变量array1
		//不能称作数组的复制
		//arry1和array2地址值相同,都指向了堆空间的唯一的空间
		array2 = array1;
		
		//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		for(int i = 0;i < array2.length;i++) {
			
			if(i % 2 == 0) {
				array2[i] = i;
			}
		}
		System.out.println();
		//打印array1
		for(int i = 0;i < array1.length;i++) {
			System.out.print(array1[i] + "\t");//打印array1内容
		}
		System.out.println();
	}	
}
//上面内容为复制功能:只是将地址值进行交换
/*
使用简单数组
拓展:修改题目,实现array2对array1数组的复制array2 = new int[array1.length];//真正的改为复制而不是同用一个地址值
//这个代码是真正将代码进行了复制的功能		
 * */
public class ArrayExer3 {

	public static void main(String[] args) { //alt + /
		int[] array1,array2;
		
		array1 = new int[] {2,3,5,7,11,13,17,19};
		
		//显示array1的内容
		for(int i = 0;i < array1.length;i++) {
			System.out.print(array1[i] + "\t");//打印array1内容
		}
		
		//赋值arrary2变量array1
		array2 = new int[array1.length];//真正的改为复制而不是同用一个地址值
		for(int i = 0;i < array2.length;i++) {
			array2[i] = array1[i];
		}
		//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		for(int i = 0;i < array2.length;i++) {
			
			if(i % 2 == 0) {
				array2[i] = i;
			}
		}
		System.out.println();
		//打印array1
		for(int i = 0;i < array1.length;i++) {
			System.out.print(array1[i] + "\t");//打印array1内容
		}
		System.out.println();
	}	
}
/*************************************************************/

/*
 * 算法的考查:数组的复制、反转、查找(线性查找、二分法查找)
 * 以下代码考验的是:for循环中的条件变量的使用、和两种变量交换方式
 * 
 * */
public class ArrayTest2 {
  
	public static void main(String[] args) {
		
		String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
		
		
		//数组的复制(区别于数组变量的赋值: arr1 = arr)
		String[] arr1 = new String[arr.length];
		for(int i = 0;i < arr1.length;i++) {
			arr1[i] = arr[i];
		}
		
		//数组的反转
		//方法一
//		for(int i = 0;i < arr1.length;i++) {
//			String temp = arr[i];
//			arr[i] = arr[arr.length - i - 1];
//			arr[arr.length - i - 1] = temp; 
//		}
		
		//方法二:
		for(int i = 0,j = arr.length - 1;i < j;i++,j--) {
			String temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
		
		//查找(或搜索)
		//线性查找:
		String dest = "BB";
		boolean isFlag = true; 
		for(int i = 0;i < arr.length;i++) {
			if(dest.equals(arr[i])) {
				System.out.println("找到了指定的元素,位置为:" + i);
				isFlag = false;
				break;
			}
		}
		if(isFlag) {
			System.out.println("很遗憾,没有找到哦!");
		}
    	//二分法查找
		int[] arr2 = new int[] {-98,-34,2,34,54,66,79,105,210,333};
		
		int dest1 = -34;
		int head = 0;//初始的首索引
		int end = arr2.length - 1;//初始的末索引
		boolean isFlag1 = true;
		while(head <= end) {
			
			int middle = (head + end)/2;
			
			if(dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为: " + middle);
			    isFlag1 = false;
			    break;
			}else if(arr2[middle] > dest1) {
				end = middle - 1;
			}else {//arr2[middle] < dest1
				head = middle + 1;
			}
		}
	   if(isFlag1) {
		   System.out.println("很遗憾,没有找到!");
	   }	
	}
	}
}
4.数组元素的排序算法
排序算法:内部排序和外部排序需要借助外部存储设备的
所有编程语言中的经典排序算法:(学会for循环和数组下面就会简单很多,temp交换是核心)
选择排序
直接选择排序、堆排序
交换排序
冒泡排序、快速排序
插入排序
直接插入排序、折半插入排序、Shell排序
归并排序
捅式排序
基数排序
//算法的5大特征
输入(Input)
输入(Output)
有穷性(有限性,Finiteness)
确定性(明确性,Definiteness)
可行性(有效性,Effectiveness)
思考每个排序的使用速度逻辑。
时间复杂度、空间复杂度、稳定性
2.排序的分类:内部排序于外部排序(要借助磁盘)
3.不同排序算法的时间复杂度
只需要自己百度了解即可
Arrays工具
import java.util.Arrays;

/*
 * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
 * 
 * */
public class ArraysTest {
      
	public static void main(String[] args) {
		
		//1.boolean equals(int[] a,int[] b):判断两个数组是否相等
		int[] arr1 = new int[] {1,2,3,4};
		int[] arr2 = new int[] {1,3,2,4};
		boolean isEquals = Arrays.equals(arr1, arr2);
		System.out.println(isEquals);
		
		//2.String toString(int[] a):输出数组信息.
		System.out.println(Arrays.toString(arr1));
		
		//3.void fill(int[] a,int val):将指定值填充到数组之中
		Arrays.fill(arr1,10);
		System.out.println(Arrays.toString(arr1));
		
		//4.void sort(int [] a):对数组进行排序。
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2));
		
		//5.int binarySearch(int[] a,int key)
		int[] arr3 = new int[] {-98,-34,2,34,54,66,79,105,210,333};
		int index = Arrays.binarySearch(arr3, 210);
		if(index >= 0) {
		System.out.println(index);
		}else {
			System.out.println("未找到");
		}
	}
}
//将数组(Arrays)的5种方式使用

关于数组会出现的两种异常

/*
 *  数组中的常见异常:
 *  1. 数组角标越界的异常:ArrayIndexOutOfBoundsException
 *  
 *  2.空指针异常:NullPointerException
 *  
 *  
 * */
public class ArrayExceptrionTest {
   
	public static void main(String[] args) {
		
		
		//1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
		int[] arr = new int[] {1,2,3,4,5};
		
//		for(int i = 0;i <= arr.length;i++) {
//			System.out.println(arr[i]);
//		}
//		System.out.println(arr[-2]);
		
//		System.out.println("hello");// !!!当出现数组越界异常时就不再运行项目!!!
		
		//2.2 空指针异常:NullPointerException
		//情况一:
		int[] arr1 = new int[] {1,2,3};
		arr1 = null;
		System.out.println(arr1[0]);
		
		//情况二:
		int[][] arr2 = new int[4][];
		System.out.println(arr2[0]);
		
		//情况三:
		String[] arr3 = new String[] {"AA","BB","CC"};
		arr3[0] = null;
		System.out.println(arr3[0].toString());
	}
}

以上是我的更新,我会继续向越来越好的进行更新,每天都会进行总结更新,分享学习的经验,数组和循环确实知识点很多,之前从学习概念,到后面学习逻辑方法确实改变啦很多也进步了很多,越是难的地方当克服困难后发现进步很大

posted on 2025-09-24 17:41  超哥进阶之路  阅读(5)  评论(0)    收藏  举报