【JAVA 笔记】09 ch06_arrays_sort_and_search

  • 第6章 数组、排序和查找
    • 数组介绍
    • 数组的使用
      • 使用方式1-动态初始化数组的定义
      • 使用方式2-动态初始化
      • 使用方式3-静态初始化
    • 数组使用注意事项和细节
    • 数组应用案例
    • 数组赋值机制
    • 数组拷贝
    • 数组添加/扩容
    • 多维数组 二维数组
      • 动态初始化1
      • 动态初始化2
      • 静态初始化
    • 二维数组的应用案例
    • 二维数组使用细节和注意事项

第6章 数组、排序和查找

数组介绍

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。

数组的使用

使用方式1-动态初始化数组的定义

数据类型数组名[]=new数据类型[大小]

int a[] = new int[5];//创建了一个数组,名字a,存放5个int

说明: 这是定义数组的一种方法。

import java.util.Scanner;
public class Array02 { 

    //编写一个main方法
    public static void main(String[] args) {
        //演示 数据类型 数组名[]=new 数据类型[大小]
        //循环输入5个成绩,保存到double数组,并输出

        //步骤
        //1. 创建一个 double 数组,大小 5

        //(1) 第一种动态分配方式
        //double scores[] = new double[5];
        //(2) 第2种动态分配方式, 先声明数组,再 new 分配空间
        double scores[] ; //声明数组, 这时 scores 是 null
        scores = new double[5]; // 分配内存空间,可以存放数据


        //2. 循环输入
        //   scores.length 表示数组的大小/长度
        //   
        Scanner myScanner = new Scanner(System.in);
        for( int i = 0; i < scores.length; i++) {
            System.out.println("请输入第"+ (i+1) +"个元素的值");
            scores[i] = myScanner.nextDouble();
        }

        //输出,遍历数组
        System.out.println("==数组的元素/值的情况如下:===");
        for( int i = 0; i < scores.length; i++) {
            System.out.println("第"+ (i+1) +"个元素的值=" + scores[i]);
        }
    }
}
使用方式2-动态初始化

1.先声明数组

语法:数据类型数组名[]; 也可以数据类型[] 数组名;

int a[]; 或者int[] a;

2.创建数组

语法: 数组名=new 数据类型[大小];

a=new int[10];

使用方式3-静态初始化

初始化数组

语法:

数据类型 数组名[]={元素值,元素值...}

int a[]={2,5,6,7,8,89,90,34,56},

数组使用注意事项和细节

  1. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  1. 数组创建后,如果没有赋值,有默认值
    int 0short 0byte 0long 0float 0.0double 0.0 char \u0000boolean falseString null
  1. 数组属引用类型,数组型数据是对象(object)

数组应用案例

创建一个char 类型的26 个元素的数组,分别放置'A'-'Z'。使用for 循环访问所有元素并打印出来。提示:char 类型数据运算'A'+2 -> 'C'

public class ArrayExercise01 { 

    //编写一个main方法
    public static void main(String[] args) {

        /*
        创建一个char类型的26个元素的数组,分别 放置'A'-'Z'。
        使用for循环访问所有元素并打印出来。
        提示:char类型数据运算 'A'+1 -> 'B'  

        思路分析
        1. 定义一个 数组  char[] chars = new char[26]
        2. 因为 'A' + 1 = 'B' 类推,所以老师使用for来赋值
        3. 使用for循环访问所有元素
         */
        char[] chars = new char[26];
        for( int i = 0; i < chars.length; i++) {//循环26次
            //chars 是 char[] 
            //chars[i] 是 char
            chars[i] = (char)('A' + i); //'A' + i 是int , 需要强制转换
        }

        //循环输出
        System.out.println("===chars数组===");
        for( int i = 0; i < chars.length; i++) {//循环26次
            System.out.print(chars[i] + " ");
        }

    }
}

数组赋值机制

数组在默认情况下是引用传递,赋的值是地址。(相比:变量往往是值传递)

int[] arr1 = {1,2,3};
int[] arr2 = arr1;

数组拷贝

编写代码实现数组拷贝(内容复制)

int[] arr1 = {10,20,30};
int[] arr2 = new int[arr1.length];
for(int i = 0; i < arr1.length; i++) {
    arr2[i] = arr1[i];
}

数组添加/扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。

  1. 原始数组使用静态分配 int[] arr = {1,2,3}
  1. 增加的元素4,直接放在数组的最后arr = {1,2,3,4}
  1. 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
1. 定义初始数组int[] arr = {1,2,3}//下标0-2
2. 定义一个新的数组int[] arrNew = new int[arr.length+1];
3. 遍历arr 数组,依次将arr 的元素拷贝到arrNew 数组
4. 将4 赋给arrNew[arrNew.length - 1] = 4;把4 赋给arrNew 最后一个元素
5. 让arr 指向arrNew ; arr = arrNew; 那么原来arr 数组就被销毁
6. 创建一个Scanner可以接受用户输入
7. 因为用户什么时候退出,不确定,使用do-while + break 来控制

多维数组 二维数组

动态初始化1

  1. 语法: 类型[][] 数组名=new 类型[大小][大小]
  1. 比如: int a[][]=new int[2][3]
  1. 二维数组在内存的存在形式(!!画图)

动态初始化2

先声明:类型数组名[][];

再定义(开辟空间) 数组名= new 类型[大小][大小]

赋值(有默认值,比如int 类型的就是0)

静态初始化

定义类型数组名[][] = {{值1,值2..},{值1,值2..},{值1,值2..}}
int[][] arr = {{1,1,1}, {8,8,9}, {100}};

二维数组的应用案例

使用二维数组打印一个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] = arr[i-1][j] + arr[i-1][j-1];

public class YangHui { 

    //编写一个main方法
    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] 
          arr[i][j]  =  arr[i-1][j] + arr[i-1][j-1]; //必须找到这个规律

         */
        int[][] yangHui = new int[12][];
        for(int i = 0; i < yangHui.length; i++) {//遍历yangHui的每个元素

            //给每个一维数组(行) 开空间
            yangHui[i] = new int[i+1];
            //给每个一维数组(行) 赋值
            for(int j = 0; j < yangHui[i].length; j++){
                //每一行的第一个元素和最后一个元素都是1
                if(j == 0 || j == yangHui[i].length - 1) {
                    yangHui[i][j] = 1;
                } else {//中间的元素
                    yangHui[i][j]  =  yangHui[i-1][j] + yangHui[i-1][j-1];
                }
            }
        }
        //输出杨辉三角
        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();//换行.
        }
    }
}

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

  1. 一维数组的声明方式有:
int[] x 或者int x[]
  1. 二维数组的声明方式有:
int[][] y 或者int[] y[] 或者int y[][]
  1. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][] 是一个二维数组
int map [][] = {{1,2},{3,4,5}}

由map[0] 是一个含有两个元素的一维数组,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组

好的,我会详细拓展每一部分,确保您能够全面理解杨辉三角的实现以及二维数组的使用细节和注意事项。

1. 二维数组的声明和初始化

一维数组的声明方式
  • int[] x;int x[];
二维数组的声明方式
  • int[][] y;int[] y[];int y[][];

2. 二维数组的初始化

二维数组实际上是由多个一维数组组成的。每个一维数组可以有不同的长度,这使得二维数组可以是矩形的,也可以是不规则的。

示例
int[][] map = {{1, 2}, {3, 4, 5}};

在这个例子中:

  • map[0] 是一个含有两个元素的一维数组 {1, 2}
  • map[1] 是一个含有三个元素的一维数组 {3, 4, 5}

3. 打印杨辉三角

代码解析
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] 
          arr[i][j]  =  arr[i-1][j] + arr[i-1][j-1]; //必须找到这个规律
         */

        // 创建一个 12 行的二维数组(第 0 行不使用)
        int[][] yangHui = new int[12][];

        // 遍历每一行
        for (int i = 0; i < yangHui.length; i++) {
            // 给每个一维数组(行)分配空间
            yangHui[i] = new int[i + 1];

            // 给每个一维数组(行)赋值
            for (int j = 0; j < yangHui[i].length; j++) {
                // 每一行的第一个元素和最后一个元素都是 1
                if (j == 0 || j == yangHui[i].length - 1) {
                    yangHui[i][j] = 1;
                } else { // 中间的元素
                    yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
                }
            }
        }

        // 输出杨辉三角
        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(); // 换行
        }
    }
}
代码详解
  1. 创建二维数组
int[][] yangHui = new int[12][];
    • 创建一个 12 行的二维数组,第 0 行不使用,实际使用 1 到 11 行。
  1. 遍历每一行
for (int i = 0; i < yangHui.length; i++) {
    yangHui[i] = new int[i + 1];
    • 为每一行分配空间,第 i 行有 i + 1 个元素。
  1. 给每个一维数组(行)赋值
for (int j = 0; j < yangHui[i].length; j++) {
    if (j == 0 || j == yangHui[i].length - 1) {
        yangHui[i][j] = 1;
    } else {
        yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
    }
}
    • 每一行的第一个和最后一个元素都是 1。
    • 其他元素的值等于上一行同一列和前一列的元素之和。
  1. 输出杨辉三角
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();
}
    • 遍历每一行并输出每个元素,使用制表符 \t 分隔。
    • 每行输出完毕后换行。

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

  1. 声明和初始化
    • 二维数组可以声明为 int[][]int[][]int[][][]
    • 初始化时可以指定每个一维数组的长度,也可以动态分配。
int[][] matrix = new int[3][4]; // 3 行 4 列的矩形数组
int[][] jaggedArray = new int[3][]; // 3 行,每行的列数可以不同
jaggedArray[0] = new int[2];
jaggedArray[1] = new int[3];
jaggedArray[2] = new int[4];
  1. 访问和修改
    • 访问二维数组的元素使用 array[row][column]
    • 修改元素时也使用相同的语法。
int[][] matrix = new int[3][4];
matrix[0][0] = 1; // 访问并修改元素
int value = matrix[0][0]; // 访问元素
  1. 不规则二维数组
    • 二维数组的每个一维数组可以有不同的长度。
    • 例如:int[][] map = {{1, 2}, {3, 4, 5}};
int[][] map = {{1, 2}, {3, 4, 5}};
System.out.println(map[0][1]); // 输出 2
System.out.println(map[1][2]); // 输出 5
  1. 遍历
    • 使用嵌套的 for 循环遍历二维数组。
    • 外层循环遍历行,内层循环遍历列。
int[][] matrix = new int[3][4];
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}
  1. 内存布局
    • 二维数组在内存中是以一维数组的形式存储的,每个一维数组是连续的。
    • 例如,int[][] array = new int[3][4]; 在内存中是按行存储的。
array[0] -> [0, 0, 0, 0]
array[1] -> [0, 0, 0, 0]
array[2] -> [0, 0, 0, 0]

5. 常见问题和解决方案

  1. 数组越界异常
    • 确保在访问数组元素时,索引在合法范围内。
int[][] matrix = new int[3][4];
try {
    System.out.println(matrix[3][0]); // 会导致 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组越界异常");
}
  1. 初始化不完全
    • 确保每个一维数组都被正确初始化。
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2];
jaggedArray[1] = new int[3];
jaggedArray[2] = new int[4];
  1. 性能优化
    • 在处理大规模数据时,考虑使用更高效的数据结构或算法。
    • 例如,使用 ArrayList 代替数组,或者使用多线程处理数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904918.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言实现归并排序

#include <stdio.h> #include <stdlib.h> #include<time.h> #include<string.h> #define N 7 // 定义元素类型为整型 typedef int ElemType; // 定义静态表结构体 typedef struct{ ElemType *elem; // 动态分配的数组指针 int TableL…

第十八章 Vue组件样式范围配置之scoped

目录 一、引言 二、案例演示 2.1. 工程结构图 2.2. 核心代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. BaseOne.vue 2.2.4. BaseTwo.vue 2.3. 运行效果 2.4. 调整代码 2.4.1. BaseTwo.vue 2.4.2. 运行效果 三、scoped原理 一、引言 前面的几个章节在介绍组件的时…

Linux 中,flock 对文件加锁

在Linux中&#xff0c;flock是一个用于对文件加锁的实用程序&#xff0c;它可以帮助协调多个进程对同一个文件的访问&#xff0c;避免出现数据不一致或冲突等问题。以下是对flock的详细介绍&#xff1a; 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

stm32入门教程-- DMA数据转运

目录 简介 原理 实验示例 1、DMA数据转运 实现代码 实验效果 原理 实验示例 1、DMA数据转运 接线图 存储器映像 我们在开始代码之前&#xff0c;可以看下我们定义的数据&#xff0c;到底是不是真的存储在了这个相应的地址区间里&#xff0c;我们看代码&#xff1a; …

SELS-SSL/TLS

一、了解公钥加密&#xff08;非对称加密&#xff09; 非对称加密中&#xff0c;用于加密数据的密钥与用于解密数据的密钥不同。私钥仅所有者知晓&#xff0c;而公钥则可自由分发。发送方使用接收方的公钥对数据进行加密&#xff0c;数据仅能使用相应的私钥进行解密。 你可以将…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…

【机器学习】 15. SVM 支撑向量机 support vector machine,拉格朗日,软边界,核函数

SVM 支撑向量机 support vector machine&#xff0c;拉格朗日&#xff0c;软边界&#xff0c;核函数 1. 超平面边界 margin of hyperplane2. 边界越大的超平面越好原因 3. 线性模型通过决策边界分类4. SVM的问题5. 拉格朗日乘子与SVM结合求最大边界6. SVM软边界和硬边界7. 非线…

多线程学习篇六:park / unpark

1. API LockSupport.park()&#xff1a;暂停当前线程LockSupport.unpark (线程对象)&#xff1a;恢复某个线程的运行 1.1 先 park 再 unpark main 线程睡眠时间大于 t1 线程睡眠时间 Slf4j(topic "c.Test01") public class Test01 {public static void main(Str…

传承双百基因 大将军F9轻松跑“盈”脐橙创富路

“江作青罗带&#xff0c;山如碧玉簪。”广西河池&#xff0c;地处桂林西北一隅&#xff0c;奇秀的喀斯特地貌纵横绵延&#xff0c;亚热带季风气候温润宜人&#xff0c;堪称种植脐橙的“天选之地”。 正值秋季&#xff0c;这里漫山遍野&#xff0c;“橙”香四溢&#xff0c;大量…

一图看懂亚信安全2024年三季度财报

一图看懂亚信安全2024年三季度财报&#xff0c; 2024年前三季度营收创历史新高&#xff0c; 净利润、经营现金流加速增长&#xff01; &#xff08;相关信息主要摘自亚信安全2024年三季度财报&#xff0c; 如存在差异&#xff0c;以亚信安全2024年三季度财报为准。&#xff0…

arm 体系架构-过程调用标准AAPCS

一、什么是AAPCS&#xff1f; 旧时&#xff0c;ARM 过程调用标准叫做 APCS (ARM Procedure Call Standard)&#xff0c;Thumb的过程调用标准为 TPCS。如今这两种叫法已经废弃&#xff0c;统一称作 AAPCS (Procedure Call Standard for the ARM Architecture)。 AAPCS 是 ARM …

Kubernetes运行大数据组件-运行spark

部署组件 ● spark-historyserver ● spark-client 配置文件 kind: ConfigMap apiVersion: v1 metadata:name: spark data:spark-defaults.conf: |-spark.eventLog.enabled truespark.eventLog.dir hdfs://192.168.199.56:8020/eventLogsspark.ev…

STM32FreeRTOS 使用QSPI驱动nandFlash

STM32FreeRTOS 使用QSPI驱动nandFlash 不清楚为什么STM32同时打开3个以上的音频文件时会出现播放问题&#xff0c;所以更换方案。因为SRAM的内存空间过小&#xff0c;用于存储音频文件不适合&#xff0c;所以使用大小为128MByte的nandFlash。 nandFlash使用华邦的W25N01GVZEI…

Nature Communications|综述|无线胶囊内窥镜机器人的最新研究进展和未来发展方向(健康监测/柔性传感/可吞服电子)

浙江大学杨华勇(Huayong Yang)院士和韩冬( Dong Han)特聘研究员团队,在期刊《Nature Communications》上发布了一篇题为“Robotic wireless capsule endoscopy: recent advances and upcoming technologies”的综述论文,博士生曹青(Qing Cao)为论文第一作者。综述内容如…

群控系统服务端开发模式-应用开发-安装及提交仓库

整个应用采用的是现有的流行模式&#xff0c;前后分离。应用架构前端采用vue-element-admin&#xff0c;API接口采用的是thinkphp6&#xff0c;数据库采用的是MySQL5.7.36&#xff0c;而事件处理我采用的是分布式队列rabbitMQ。 首先安装及调整API接口系统业务架构逻辑。根据《…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

揭秘世界技能大赛健康与社会照护项目,对智慧养老专业建设的启示

一、世界技能大赛&#xff08;世赛&#xff09;&#xff1a;职业技能的巅峰对决 被誉为“职业技能奥林匹克”的世界技能大赛是全球最高水平的职业技能竞赛&#xff0c;代表着各行业职业技能发展的国际先进水平。赛事涵盖六大领域&#xff1a;建筑与工程技术、创意艺术与时尚、…

【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置

需求说明 鼠标点击3D场景时&#xff0c;可以获取其所在的世界坐标&#xff1b; 鼠标点击3D物体时&#xff0c;可以获取该物体&#xff1b; 鼠标点击3D物体时&#xff0c;可以让玩家移动至该物体&#xff1b; 成果展示 Scene部分 关于仓库栏的设置&#xff0c;物体如何进入…

搭建支持国密GmSSL的Nginx环境

准备 1、服务器准备&#xff1a;本文搭建使用的服务器是CentOS 7.6 2、安装包准备&#xff1a;需要GmSSL、国密Nginx&#xff0c;可通过互联网下载或者从 https://download.csdn.net/download/m0_46665077/89936158 下载国密GmSSL安装包和国密Nginx安装包。 服务器安装依赖包…