Java基础-第6章-数组

6 数组

本章需要注意的知识:

  1. 判断字符串相等的方法
    findName.equals(names[i]))
    2.数组交换的是地址,和一般的常量交换有所不同
  2. List item

6.10 冒泡排序法

  • 冒泡排序(Bubble Sorting)的基本思想是:
    通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
    在这里插入图片描述
  • 下面我们举一个具体的案例来说明冒泡法。我们将五个无序:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列。
    在这里插入图片描述

public class BubbleSort {
//编写一个 main 方法
	public static void main(String[] args) {
//老韩 化繁为简,先死后活
//
/*
冒泡排序法::
几轮排序:元素个数-1
数组 [24,69,80,57,13]
第 1 轮排序: 目标把最大数放在最后
第 1 次比较[24,69,80,57,13]
第 2 次比较[24,69,80,57,13]
第 3 次比较[24,69,57,80,13]
第 4 次比较[24,69,57,13,80]
*/
int[] arr = {24, 69, 80, 57, 13, -1, 30, 200, -110};
int temp = 0; //用于辅助交换的变量
//将多轮排序使用外层循环包括起来即可
//先死后活 =》 4 就是 arr.length - 1
for( int i = 0; i < arr.length - 1; i++) {//外层循环是 4 次
	for( int j = 0; j < arr.length - i -1; j++) {//4 次比较-3 次-2 次-1 次
	//如果前面的数>后面的数,就交换
		if(arr[j] > arr[j + 1]) {
		temp = arr[j];
		arr[j] = arr[j+1];
		arr[j+1] = temp;
		}
	}
	System.out.println("\n==第"+(i+1)+"轮==");
	for(int j = 0; j < arr.length; j++) {
	System.out.print(arr[j] + "\t");
	}
}
// for( int j = 0; j < 4; j++) {//4 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("==第 1 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// /*
// 第 2 轮排序: 目标把第二大数放在倒数第二位置
// 第 1 次比较[24,69,57,13,80]
// 第 2 次比较[24,57,69,13,80]
// 第 3 次比较[24,57,13,69,80]
// */
// for( int j = 0; j < 3; j++) {//3 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 2 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// 第 3 轮排序: 目标把第 3 大数放在倒数第 3 位置
// 第 1 次比较[24,57,13,69,80]
// 第 2 次比较[24,13,57,69,80]
// for( int j = 0; j < 2; j++) {//2 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 3 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// /*
// 第 4 轮排序: 目标把第 4 大数放在倒数第 4 位置
// 第 1 次比较[13,24,57,69,80]
// */
// for( int j = 0; j < 1; j++) {//1 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 4 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
}
}

6.11 查找

6.11.1 介绍:
在 java 中,我们常用的查找有两种:
1) 顺序查找 SeqSearch.java
2) 二分查找【二分法,我们放在算法讲解】

6.12 案例演示:

  1. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
    要求: 如果找到了,就提示找到,并给出下标值。
import java.util.Scanner;
public class SeqSearch {
//编写一个 main 方法
public static void main(String[] args) {
/*
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
要求: 如果找到了,就提示找到,并给出下标值
思路分析
1. 定义一个字符串数组
2. 接收用户输入, 遍历数组,逐一比较,如果有,则提示信息,并退出
*/
//定义一个字符串数组
String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String findName = myScanner.next();
//遍历数组,逐一比较,如果有,则提示信息,并退出
//这里老师给大家一个编程思想/技巧, 一个经典的方法
int index = -1;
for(int i = 0; i < names.length; i++) {
	//比较 字符串比较 equals, 如果要找到名字就是当前元素
	if(findName.equals(names[i])) { //这里是判断字符串相等的方法
	System.out.println("恭喜你找到 " + findName);
	System.out.println("下标为= " + i);
	//把 i 保存到 index
	index = i;
	break;//退出
	}
}
if(index == -1) { //没有找到
System.out.println("sorry ,没有找到 " + findName);
}
}
}
  1. 请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,
    如果没有就提示"没有这个数"。
//暂无代码

6.13 多维数组

多维数组我们只介绍二维数组。
二维数组的应用场景
比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。如图:
在这里插入图片描述

6.14 二维数组的使用

6.14.1 二维数组快速入门案例

请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0

public class TwoDimensionalArray01 {
//编写一个 main 方法
	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
	*/
	//什么是二维数组:
	//老韩解读
	//1. 从定义形式上看 int[][]
	//2. 可以这样理解,原来的一维数组的每个元素是一维数组, 就构成二维数组
	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+1 个值 arr[i][j];
	// 举例 访问 3, =》 他是第 3 个一维数组的第 4 个值 arr[2][3]
	System.out.println("第 3 个一维数组的第 4 个值=" + arr[2][3]); //3
	//输出二维图形
	for(int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
	//遍历二维数组的每个元素(数组)
	//老韩解读
	//1. arr[i] 表示 二维数组的第 i+1 个元素 比如 arr[0]:二维数组的第一个元素
	//2. arr[i].length 得到 对应的 每个一维数组的长度
		for(int j = 0; j < arr[i].length; j++) {
		System.out.print(arr[i][j] + " "); //输出了一维数组
		}
	System.out.println();//换行
	}
	
	}
}

-二维数组的初始化有两种:

  • 动态初始化

其中动态初始化有三种表现形式

  • 静态初始化
6.14.2 二维数组的动态初始化(1)
  动态初始化的第一种表现形式
TwoDimensionalArray02.java
1) 语法: 类型[][] 数组名= new 类型[大小][大小]
2) 比如: int a[][]=new int[2][3
代码展示 
public class TwoDimensionalArray02 {
//编写一个 main 方法
public static void main(String[] args) {
//int arr[][] = new int[2][3];
int arr[][]; //声明二维数组
arr = new int[2][3];//再开空间
arr[1][1] = 8;
//遍历 arr 数组
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {//对每个一维数组遍历
System.out.print(arr[i][j] +" ");
}
System.out.println();//换行
}
}
}

二维数组在内存中的存在形式
在这里插入图片描述

6.14.3 二维数组的动态初始化(2)
先声明:类型 数组名[][]; 
再定义(开辟空间) :数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0
6.14.4 二维数组的动态初始化(3)列数不确定

在这里插入图片描述

public class TwoDimensionalArray03 {
//编写一个 main 方法
	public static void main(String[] args) {
	/*
	看一个需求:动态创建下面二维数组,并输出
	i = 0: 1
	i = 1: 2 2
	i = 2: 3 3 3
	一个有三个一维数组, 每个一维数组的元素是不一样的
	*/
	//创建 二维数组,一个有 3 个一维数组,但是每个一维数组还没有开数据空间
	int[][] arr = new int[3][];
	for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
	//给每个一维数组开空间 new
	//如果没有给一维数组 new ,那么 arr[i]就是 null
	arr[i] = new int[i + 1];
	//遍历一维数组,并给一维数组的每个元素赋值
		for(int j = 0; j < arr[i].length; j++) {
		arr[i][j] = i + 1;//赋值	
		}																																		
	}
	System.out.println("=====arr 元素=====");
	//遍历 arr 输出
	for(int i = 0; i < arr.length; i++) {
	//输出 arr 的每个一维数组
		for(int j = 0; j < arr[i].length; j++) {
		System.out.print(arr[i][j] + " ");
		}
	System.out.println();//换行
	}
}
}
6.14.5 二维数组的静态初始化
定义 :
类型 数组名[][] = {{值 1,值 2..},{值 1,值 2..},{值 1,值 2..}}
使用即可 [ 固定方式访问 ]
比如:
int[][] arr = {{1,1,1}, {8,8,9}, {100}};
解读
1. 定义了一个二维数组 arr
2. 2. arr 有三个元素(每个元素都是一维数组)
3. 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素
6.14.6 静态初始化案例

int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和

比较简单,暂无代码

6.15 二维数组的应用案例 -杨辉三角

  1. 使用二维数组打印一个 10 行杨辉三角 YangHui.java
public class YangHui {
    public static void main(String[] args) {
//        使用二维数组打印一个 10 行杨辉三角
//          1
//        1 1
//        1 2 1
//        1 3 3 1
//        1 4 6 4 1
//        1 5 10 10 5 1
//        规律
//        1.第一行有 1 个元素, 第 n 行有 n 个元素
//        2. 每一行的第一个元素和最后一个元素都是 1
//        3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值. arr[i][j]
        int [][] Yanghui = new int[10][];
        for(int i = 0; i < Yanghui.length; i ++ ){//这里是第一个技巧:i < Yanghui.length;
            Yanghui[i] = new int[i + 1];
            for(int j = 0;j < Yanghui[i].length; j++){
                if(j == 0 || j == Yanghui[i].length - 1 ){ //这里是第二个技巧:j == arr.length - 1 ,特别注意这里是||符号
                    Yanghui[i][j] = 1;
                }else{
                    Yanghui[i][j] = Yanghui[i-1][j-1] + Yanghui[i-1][j];
                }
            }
        }

        System.out.println("=====遍历输出=====");
        for(int i = 0; i < Yanghui.length; i++ ){
            for(int j = 0; j < Yanghui[i].length;j++ ){
                System.out.print(Yanghui[i][j] + "\t");
            }
            //换行
            System.out.println();
        }
    }
}

6.16 二维数组使用细节和注意事项

  • (1)一维数组的声明方式有:
    int[] x 或者 int x[]
  • (2) 二维数组的声明方式有:
    int[][] y 或者 int[] y[] 者 或者 int y[][]
  • (3) 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。
    比如:
    map[][] 是一个二维数组 int map [][] = {{1,2},{3,4,5}}
    map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组

6.17 二维数组课堂练习

在这里插入图片描述

6.18 本章作业

在这里插入图片描述
** 分析示意图 **
在这里插入图片描述

  • 相关代码

import java.util.Scanner;
public class work04 {
    public static void main(String[] args) {
/*
        /已知有个升序数组,要求插入一个数之后,仍然是升序数组。
        // 给定数组:{10,12,45,90},要求在该数组中插入一个数23,插入后的数组仍然是升序。
        思路:
        静态初始化数组,
        1. 先定位插入到哪里
        2.扩容便利,如果到了这个位置,就插入,如果不是这个位置,就接着遍历
 */
        int arr[] = {10,12,45,90};
        Scanner myscanner = new Scanner(System.in);
        System.out.println("请输入需要插入的数字:");
        int InsertNum = myscanner.nextInt();
//        System.out.println("=========1.定位============");
        int inde = -2;
        for(int i = 0;i < arr.length;i++){  // 定位
            System.out.print( arr[i]+ "\t");
            if(InsertNum <= arr[i]){
                inde = i;
                break;// 一旦找到满足条件的就break循环,才能保证后面不出错。
            }
        }
//        System.out.println("=========2.扩容插入============");
        int arr2[] = new int[arr.length + 1];
        for (int j = 0, k = 0; j < arr2.length; j++) {//扩容
            if (j != inde) { //如果满足这个条件,插入
                arr2[j] = arr[k];
                k++;
            } else{  // 如果不满足上述的条件,将原来数组的值赋值给新数组。
                arr2[j] = InsertNum;
            }
        }
        System.out.println("=========3.输出最终结果============");
        for(int i = 0; i< arr2.length;i++){
            System.out.print(arr2[i] + "\t");
        }



    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值