Java 3 —— 数组

1 一维数组

1.1 数组的基础知识

package com.seuer.java;
/**
 * 
 * @author LF
 *
 */
public class ArrayTest {
	public static void main(String[] args) {
		
		int[] ids;//声明
		//1.1 静态初始化:数组初始化+元素赋值同时操作
		ids = new int[]{101,102,103,104};
		//1.2 动态初始化:分开进行
        int[] ids1 = new int[5];
		String[] names = new String[1]{"LF"};
		//总结:初始化后长度确定
		
		//2.如何调用指定位置的元素:通过角标的方式调用
		//数组的角标从0开始,到数组的长度-1结束。
		names[0] = "王明";
		names[1] = "王鹤";
		names[2] = "张琪";
		names[3] = "王宏志";
		names[4] = "周勇";//charAt(0)
		
		//3.如何获取数组的长度
		//属性:length
		System.out.println(names.length);
		
		
		//4.如何遍历数组
		for (int i = 0; i < names.length; i++) {
			System.out.println(names[i]);
		}
		
		//5.数组元素的默认初始化值
		//数组元素是整型,默认初始化值都为0
		//浮点型 0.0
		//char 0 或 '\u0000'而非'0'
		//数组元素是boolean型:false
		
		//引用数据类型 null
		int[] arr = new int[4];
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);//默认初始化值=0
		}
		System.out.println("***********");
		
		char[] arr1 = new char[3];
		for (int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i]);
		}
		System.out.println("***********");
		
		boolean[] arr2 = new boolean[3];
		for (int i = 0; i < arr2.length; i++) {
			System.out.println(arr2[0]);
		}
		System.out.println("***********");
		
		String[] arr3 = new String[4];
		for (int i = 0; i < arr3.length; i++) {
			System.out.println(arr3[i]);
		}
		
	}
}

1.2 数组的内存机制

1.2.1 内存的主要结构

放在main方法里的都是局部变量;new 堆空间里面重新开辟;利用指针练习堆和栈

0x12ab之后被回收

1.2.2 练习1

package com.seuer.exer;

public class ArrayDemo {
	public static void main(String[] args) {
		int[] arr = new int[] { 8, 2, 1, 0, 3};
		int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
		String tel = "";
		for (int i = 0; i < index.length; i++) {
			tel += arr[index[i]];
		}
		System.out.println("联系方式:" + tel);
	}
}

1.2.3 练习2

package com.seuer.exer;

import java.util.Scanner;

public class ArrayDemo1 {
	public static void main(String[] args) {
		//1.使用scanner,读取学生个数
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入学生人数:");
		int num = scanner.nextInt();
		
		//2.创建数组,存储学生成绩,动态初始化
		int[] scores = new int[num];
		
		//3.给数组元素赋值
		//4.求出最大值
		int maxScore = 0;
		System.out.println("请输入" + num + "个学生成绩");
		for (int i = 0; i < scores.length; i++) {
			scores[i] = scanner.nextInt();
			if (maxScore < scores[i]) {
				maxScore = scores[i];
			}
		}

		//5.将分数和最高分比较,输出分数和等级
		char level;
		for (int i = 0; i < scores.length; i++) {
			if (maxScore - scores[i] <= 10) {
				level = 'A';
			}else if (maxScore - scores[i] <= 20) {
				level = 'B';
			}else if (maxScore - scores[i] <= 30) {
				level = 'C';
			}else {
				level = 'D';
			}
			
			System.out.println("student " + i + " score is "
					+ scores[i] + " ,grades is " + level);
		}
	}

}

2 二维数组

数组本身是引用数据类型,数组的元素也可以是引用数据类型,数组的元素是数组

2.1 基础知识

package com.seuer.java;
/**
 * 
 * @author LF
 *
 */
public class TwoArrayTest {
	public static void main(String[] args) {
		
		//1.1 静态初始化:数组初始化+元素赋值同时操作
		int[] arr = new int[]{1,2,3};//一维数组
		int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
		//1.2 动态初始化:分开进行
		String[] names = new String[5];
		String[][] arr2 = new String[3][2];
		String[][] arr3 = new String[3][];
		
		
		int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};
		//总结:初始化后长度确定
		
		//2.如何调用指定位置的元素:通过角标的方式调用
		//数组的角标从0开始,到数组的长度-1结束。
		int[] arr4[] = new int[][]{{1,2,3},{4,5},{6,7,8}};
		System.out.println(arr1[0][1]);
		System.out.println(arr2[1][1]);//null
		
		//3.如何获取数组的长度
		//属性:length
		System.out.println(arr4.length);//3
		System.out.println(arr4[1].length);//4
		
		
		//4.如何遍历数组
		for (int i = 0; i < arr4.length; i++) {
			for (int j = 0; j < arr4[i].length; j++) {
				System.out.println(arr4[i][j] + " ");
			}
		}
		
		//5.内外层元素
        //初始化值
        /*
        整型 0
        浮点型 0.0
        char 0
        boolean false
        引用类型 null
        */
		int[][] arr6 = new int[4][3];
		System.out.println(arr6[0]);//[I@15db9742 地址值
		System.out.println(arr6[0][0]);
		
		System.out.println("*****************");
		float[][] arr7 = new float[4][3];
		System.out.println(arr7[0]);//地址值
		System.out.println(arr7[0][0]);//0.0
		
		System.out.println("*****************");
		String[][] arr8 = new String[4][2];
		System.out.println(arr8[1]);//地址值
		System.out.println(arr8[1][1]);//null
		
		System.out.println("*****************");
		double[][] arr9 = new double[4][];
		System.out.println(arr9[1]);//null 指针没东西指
		System.out.println(arr9[1][0]);//报错:空指针异常
		
		
	}
}

 

2.2 内存解析

引用型的变量,存储的要么是null要么是地址值,不是直接存储元素本身。字符串存放在常量池里面

2.2 课后练习 **

 

package com.seuer.array2;

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];//第0行有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] + yangHui[i-1][j-1];
				}
			}
		}
		//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.3 算法题 ****

2.3.1 元素赋值 ***

杨辉三角

回型数

  1. 设置变量指示方向
  2. 每次改方向时四个变量如何修改
package com.seuer.array2;

import java.util.Scanner;

public class RectangleTest {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个数字: ");
		int len = scanner.nextInt();
		int[][] arr = new int[len][len];
		
		int s = len * len;
		/*
		 * k = 1 向右 k = 2 向下 
		 * k = 3 向左 k = 4 向上
		 */
		int k = 1;
		int i = 0, j = 0;
		for(int m = 1;m <= s; m++){
			if (k == 1) {
				if (j < len && arr[i][j] == 0) {
					arr[i][j++] = m;
				} else {//碰壁了
					k = 2;
                    m--;
					i++;
					j--;
					
				}
			} else if (k == 2){
				if (i < len && arr[i][j] == 0) {
					arr[i++][j] = m;
				} else {
					k = 3;
					j--;
					i--;
					m--;
				}
			} else if (k == 3){
				if (j >= 0 && arr[i][j] == 0 ) {
					arr[i][j--] = m;
				} else {
					k = 4;
					i--;
					j++;
					m--;
				}
			} else if (k == 4) {
				if (i >= 0 && arr[i][j] == 0) {
					arr[i--][j] = m;
				}else{
					k = 1;
					i++;
					j++;
					m--;
				}
			}
		}
		for (int l = 0; l < arr.length; l++) {
			for (int m = 0; m < arr[l].length; m++) {
				System.out.print(arr[l][m] + "\t");
			}
			System.out.println();
		}
	}
}

2.3.2 元素查找 **

package com.seuer.array2;

public class ArrayTest1 {
	public static void main(String[] args) {
		int[] arr = new int[100];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random() * 90) + 10;
		}
		//求max
		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);
	}
}

2.3.3 数组复制 **

在堆空间里只有一个数组,只是把array1的地址给了array2

package com.seuer.array2;

public class ArrayTest2 {
	public static void main(String[] args) {
		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");
		}
		System.out.println();
		
		//赋值array2变量等于array1
		//地址值一样
//		array2 = array1;
//		
//		//修改array2中的偶索引元素,使其等于索引值
//		for (int i = 0; i < array2.length; i++) {
//			if (i % 2 == 0) {
//				array2[i] = i;
//			}
//		}
		
		//数组复制
		array2 = new int[array1.length];
		for (int i = 0; i < array2.length; i++) {
			array2[i] = array1[i];
		}
		
		//显示array1的内容
		for (int i = 0; i < array2.length; i++) {
			System.out.print(array2[i] + "\t");
		}
	}
}

2.3.4 数组反转 ***

package com.seuer.array2;

public class ArrayAlgorithm {
	public static void main(String[] args) {
		//复制操作
		String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
		
		//数组的复制
		String[] arr1 = new String[arr.length];
		for (int i = 0; i < arr1.length; i++) {
			arr1[i] = arr[i];
		}

		//数组反转
		//方法一
//		String temp;
//		for (int i = 0; i < arr1.length / 2; i++) {
//			temp = arr1[i];
//			arr1[i] = arr1[arr1.length-i-1];
//			arr1[arr1.length-i-1] = temp;
//		}
//		
		//方法二
		for (int i = 0, j = arr1.length - 1; i < j; i++, j--) {
			String temp = arr1[i];
			arr1[i] = arr1[j];
			arr1[j] = temp;		
		}
		for (int i = 0; i < arr1.length; i++) {
			System.out.print(arr1[i] + '\t');
		}
		
	}
}

2.3.5 数组查找 ***

package com.seuer.array2;

public class Search {
	public static void main(String[] args) {
		//方法一:线性查找
		String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
		String dest = "pp";
		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[]{-455,-32,-11,-5,0,12,34,55,67,567,678,9999};
		int dest1 = -32;
		int head = 0;//初始首索引
		int end = arr2.length - 1;
		
		isFlag = true;
		while(head <= end){
			int middle = (head + end)/2;
			if (dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为:" + middle);
				isFlag = false;
				break;
			} else if(arr2[middle] > dest1){
				end = middle - 1;	
			}else{
				head = middle + 1;
			}
		}
		if (isFlag) {
			System.out.println("没找到~");
		}
	}
}

2.3.6 排序 ***

快速排序

 

2.4 Arrays工具类

//day07
package com.seuer.array2;

import java.util.Arrays;

public class ArraysTest {
	public static void main(String[] args) {
		//1.判断两个数组是否相等
		int[] arr1 = new int[]{1,2,3,4};
		int[] arr2 = new int[]{1,3,2,4,0,-1};
		boolean isEquals = Arrays.equals(arr1, arr2);
		System.out.println(isEquals);
		
		//2.输出数组信息
		System.out.println(Arrays.toString(arr1));
		
		//3.将指定值填充到数组
		Arrays.fill(arr1, 12);
		System.out.println(Arrays.toString(arr1));
		
		//4.对数组进行排序
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2));
		
		//5.二分查找
		int[] arr3 = new int[]{-99,-32,-11,-2,0,1,20,29,76,100};
		int index = Arrays.binarySearch(arr3, 20);
		if (index >= 0) {
			System.out.println(index);
		}
	}
}

2.5 出错的情况

package com.seuer.array2;
/*
 * 1.数组角标越界异常
 * 2.空指针异常
 */
public class ArrayExceptionTest {
	public static void main(String[] args) {
		//1.角标越界
		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]);
		
		//2.空指针异常
		//情况一
//		int[] arr1 = new int[]{1,2,3};
//		arr1 = null;
//		System.out.println(arr1[0]);
		
		//情况二
//		int[][] arr2 = new int[3][];
//		System.out.println(arr2[0][0]);
		
		//情况三
		String[] arr3 = new String[]{"AA","BB","CC"};
		arr3[0] = null;
		System.out.println(arr3[0].toString());
	}
}

3 数据结构初步

3.1 存储结构

线性表:顺序表(数组)、链表、栈、队列

树形结构:二叉树

图形结构、算法

数据结构的存储方式只有两种:数组(顺序存储) 链表(链式存储)

队列、栈:可以用数组或者链表来实现

图:邻接表、邻接矩阵

4 每天一考

package com.seuer.array2;

import java.util.Arrays;

public class Exam {
	public static void main(String[] args) {
		//1.从小到大排序
		int[] arr = new int[]{34,5,22,-98,6,-76,0,-3};
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		
		//2.反转上面的数组
		for (int i = 0; i < arr.length / 2; i++) {
			int temp = arr[i];
			arr[i] = arr[arr.length - 1 - i];
			arr[arr.length - 1 - i] = temp;
		}
		System.out.println(Arrays.toString(arr));
		
		//3.复制上面的数组
		int[] arr1 = new int[arr.length];
		for (int i = 0; i < arr1.length; i++) {
			arr1[i] = arr[i];
		}
		System.out.println(Arrays.toString(arr1));
		
		//4.查找22
		int key = 22;
		for (int i = 0; i < arr1.length; i++) {
			if (arr[i] == key) {
				System.out.println("数组的第 " + (i + 1) + "个元素是 " + key);
				break;
			}
		}
		
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值