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());
}
}
以上是我的更新,我会继续向越来越好的进行更新,每天都会进行总结更新,分享学习的经验,数组和循环确实知识点很多,之前从学习概念,到后面学习逻辑方法确实改变啦很多也进步了很多,越是难的地方当克服困难后发现进步很大
浙公网安备 33010602011771号