数组
介绍:可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型,即:数组就是一组数据
package com.company.hello;
import java.util.Scanner;
/**
* 数组快速入门
*
* @author L.yn
* @version 1.0
* @date 2021/11/21 9:21
*/
public class ArrayTest {
public static void main(String[] args) {
//定义一个数组
/**
* 1、double[] 表示 是double类型的数组,数组名 hens
* 2、{3, 5, 1, 3.4, 2, 50}表示数组的值/元素
*/
double[] hens = {3, 5, 1, 3.4, 2, 50};
//遍历数组得到数组的所有元素的和
/**
* 可以通过hens[下标]来访问数组的元素,下标是从0开始编号的比如第一个元素就是hens[0]
* 通过循环访问
*/
for (double hen : hens) {
System.out.println(hen);
}
for (int i = 0; i < hens.length; i++) {
System.out.println(hens[i]);
}
//演示 循环输入五个成绩,保存到double数组,并输出
//1、创建一个double数组,大小5
double[] score = new double[5];
//2、循环输入
for (int i = 0; i < score.length; i++) {
System.out.println("请输入元素的值");
double aDouble = new Scanner(System.in).nextDouble();
score[i] = aDouble;
}
//输出,遍历数组
for (double v : score) {
System.out.println(v);
}
}
}
数组的使用
- 使用方式1-动态初始化
-
数组的定义
数据类型[] 数组名 = new 数据类型[大小]
int[] arr = new int[5];//创建了一个数组,名字为arr,存放五个int
说明:这是定义数组的一种方法
-
数组的引用(使用)
- 数组名[下标/索引],比如:你要使用A数组的第三个数 A[2]
-
- 使用方式2-动态初始化
- 先声明数组
语法:数据类型[] 数组名
int[] arr; - 创建数组
语法:数组名 = new 数据类型[大小]
arr = new int[10]
- 先声明数组
- 使用方式3-静态初始化
- 初始化数组
语法:数据类型[] 数组名 = {元素值,元素值…}
int[] arr = {1,2,3,4,5,…}
- 初始化数组
数组使用注意事项和细节
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
- 数组创建后,如果没有赋值,有默认值
- 使用数组的步骤
- 声明数组并开辟空间
- 给数组各个元素赋值
- 使用数组
- 数组的下标是从0开始的
- 数组下标必须在指定范围内使用,否则报:下标越界异常
- 数组属于引用类型,数组型数据是对象(object)
数组赋值机制
- 基本数据类型赋值,这个值就是具体的数据,而且相互不影响
int n1 = 2; int n2 = n1; - 数组在默认情况下是引用传递,赋的值是地址
排序
排序的介绍
排序是将一群数据,依指定的顺序进行排列的过程
排序的分类
-
内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法) -
外部排序法:
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法) -
冒泡排序
通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移到后,就像水底下的气泡一样逐渐向上冒package com.company.hello; /** * 冒泡排序 * * @author L.yn * @version 1.0 * @date 2021/11/28 16:02 */ public class BubbleSort { public static void main(String[] args) { /** * 将五个无序:24,69,80,57,13使用冒泡排序将其排成一个从小到大的有序数列 * 思路 * 第一轮排序:目标把最大数放在最后 * 第一次比较:[24,69,80,57,13] * 第二次比较:[24,69,80,57,13] * 第三次比较:[24,69,57,80,13] * 第四次比较:[24,69,57,13,80] * * 第二轮排序:目标把第二大数放在倒数第二位置 * 第一次比较:[24,69,57,13,80] * 第二次比较:[24,57,69,13,80] * 第三次比较:[24,57,13,69,80] * * 第三轮排序:目标把第三大数放在倒数第三位置 * 第一次比较:[24,57,13,69,80] * 第二次比较:[24,13,57,69,80] * * 第四轮排序:目标把第四大数放在倒数第四位置 * 第一次比较:[13,24,57,69,80] * * 总结冒泡排序特点 * 一:一共有五个元素 * 二:一共进行了四轮排序,可以看成是外层循环 * 三:每一轮排序可以确定一个数的位置,比如第一轮排序确定最大数... * 四:当进行比较时,如果前面的数小于后面的数,就交换 * 五:每轮比较在减少 4->3->2->1 */ int[] arr = {24, 69, 80, 57, 13}; int temp = 0;//用于辅助交换的变量 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]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } /** * 第1轮 * 24 69 57 13 80 * 第2轮 * 24 57 13 69 80 * 第3轮 * 24 13 57 69 80 * 第4轮 * 13 24 57 69 80 */ System.out.println("\n第" + (i + 1) + "轮"); for (int ae : arr) { System.out.print(ae + "\t"); } } } }
查找
介绍
在java中,我们常用的查找有两种
-
顺序查找
package com.company.hello; import java.util.Scanner; /** * 顺序查找 * * @author L.yn * @version 1.0 * @date 2021/11/28 16:41 */ public class SeqSearch { public static void main(String[] args) { /** * 有一个数列:白眉鹰王,金毛狮王,紫衫龙王,青翼蝠王猜数游戏: * 从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】 * 要求:如果找到了,就提示找到,并给出下标 * * 思路 * 一、定义一个字符串数组 * 二、接收用户输入,遍历数组,逐一比较,如果有,则提示信息,并退出 */ //定义一个字符串数组 String[] name = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"}; System.out.println("请输入名字"); String findName = new Scanner(System.in).nextLine(); boolean deflag = true; for (int i = 0; i < name.length; i++) { //比较字符串 equals,如果要找到名字就是当前元素 if (findName.equals(name[i])) { System.out.println("恭喜你找到:" + findName); System.out.println("下标=" + i); deflag = false; break; } } if (deflag){ //没有找到 System.out.println("没有找到..."); } } }
-
二分法查找
多维数组–二维数组
package com.company.hello;
/**
* 二维数组快速入门
*
* @author L.yn
* @version 1.0
* @date 2021/11/28 16:54
*/
public class TwoDimensionalArray {
public static void main(String[] args) {
/**
* 快速入门案例:
* 请用二维数组输出如下图形
* 0 0 0 0 0 0
* 0 0 1 0 0 0
* 0 2 0 3 0 0
* 0 0 0 0 0 0
*
* 什么是二维数组
* 一:从定义上看 int[][]
* 二:可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数组
*/
int[][] arr = {
{0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0},
{0, 2, 0, 3, 0, 0},
{0, 0, 0, 0, 0, 0}
};
//关于二位数组的关键概念
//1、获取二位数组的元素个数
System.out.println("二位数组的元素个数:" + arr.length);
//2、二维数组的每个元素都是一维数组,所以如果需要得到每个一维数组的值,还需要再次遍历
//3、如果我们要访问第i+1个一维数组的第j个值 arr[i][j]
//输出二维图形
for (int i = 0; i < arr.length; i++) {
//遍历二维数组的每个元素(数组)
/**
* arr[i]表示二维数组的第i+1个元素,比如arr[0]:二维数组的第一个元素
* arr[i].length 得到对应的每一个一维数组的长度
*
* 0 0 0 0 0 0
* 0 0 1 0 0 0
* 0 2 0 3 0 0
* 0 0 0 0 0 0
*/
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");//输出一维数组
}
System.out.println();//换行
}
}
}
二维数组的使用
-
使用方式一
-
语法:类型[][] 数组名 = new 类型[大小][大小] 比如:int[][] arr = new int[3][5] package com.company.hello; /** * @author L.yn * @version 1.0 * @date 2021/11/28 17:15 */ public class TwoDimensionalArray01 { public static void main(String[] args) { int[][] arr = new int[2][3]; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { /** * 0 0 0 * 0 0 0 */ System.out.print(arr[i][j] + " "); } System.out.println(); } } }
-
-
使用方式二
-
先声明 类型[][] 数组名; 在定义(开辟空间) 数组名 = new 类型[大小][大小] 赋值(有默认值,比如int类型的就是0)
-
-
使用方式三
-
看一个需求:动态创建下面的二位数组,并输出
package com.company.hello; /** * @author L.yn * @version 1.0 * @date 2021/11/28 17:34 */ public class TwoDimensionalArray02 { public static void main(String[] args) { //动态创建二位数组,并输出 int[][] arr = new int[3][]; for (int i = 0; i < arr.length; i++) { //给每个一维数组开辟空间 //如果没有给一维数组 new,那么arr[i]就是null arr[i] = new int[i + 1]; //遍历一维数组,并给一维数组赋值 for (int j = 0; j < arr[i].length; j++) { arr[i][j] = i + 1; } /** * 1 * 2 2 * 3 3 3 */ for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + "\t"); } System.out.println(); } } }
-
-
使用方式4:静态初始化
-
定义:类型[][] 数组名 = {{值1,值2,...},{值1,....},...} 比如: int[][] arr = {{1,2,3,4},{1,2,3},{1}}; 解读: 一、定义了一个二维数组 arr 二、arr有三个元素(每个元素都是一维数组) 三、第一个一维数组有四个元素,第二个一维数组有三个元素,第三个一维数组有一个元素
-
-
二位数组的遍历
-
package com.company.hello; /** * 二维数组的遍历 * * @author L.yn * @version 1.0 * @date 2021/11/28 18:12 */ public class TwoDimensionalArray03 { public static void main(String[] args) { int[][] arr = {{1, 2}, {3, 2, 1}, {-2}}; /** * 遍历该二维数组,并得到和 * * 思路 * 一、遍历二维数组,并将各个值累计到int sum */ int sum = 0; /** * 输出二位数组的值.... * 1 2 * 3 2 1 * -2 * 和:7 */ System.out.println("输出二位数组的值...."); for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { sum += arr[i][j]; } for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + "\t"); } System.out.println(); } System.out.println("和:" + sum); } }
-
-
二位数组使用细节和注意事项
-
一维数组的声明方式有:int[] x 或者 int x[]
-
二维数组的声明方式有
int[][] x 或者 int[] x[] 或者 int x[][]
-
二维数组实际上是多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不同,比如:map[][] 是一个二维数组
map[][] = {{1,2},{3,4,5}}由map[0]是一个含有两个元素的一维数组,map[1]是一个含有三个元素的一维数组构成,我们也成为列数不等的二维数组
-