当前位置: 首页 > news >正文

第五章:数组、排序和查找

我亦无他 唯手熟尔

化繁为简,先死后活

一、介绍

1.定义:

        引用数据类型,用来存储统一类型的数据

二、数组的使用

1.动态初始化:

        数据类型 数组名[] = new 数据类型[大小]  ==  数据类型[] 数组名 = new 数据类型[大小](推荐写法)

案例:循环输入5个数,保存到double数组

import java.util.*;

public class Hello {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double[] arr = new double[5];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextDouble();
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }
}

2.动态初始化:

        先声明数组,再分配数组空间        数据类型[]  数组名;  数组名 = new 数据类型[大小]

        int[] a ;  a = new int[5]  等价于   int a[]; a =new int[5];

3.静态初始化:

        数据类型 数组名[] = {数值} 等价于  数据类型[] 数组名 = {数值}          开发中用的不多

4.注意事项:

  • 数组一定要保证数据类型的相同性,但是也可以保证小转大哦,double[] a = {100,1,31,100.1};
  • 数组里面可以放任何数据,但是要保证数据的同一性
  • 数组没有赋值是有默认值的,数组下标0开始

5.案例:

        1.创建char类型数组,放置26个字符A-Z,并输出;

public class Hello {
    public static void main(String[] args) {
        char[] arr = new char[26];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (char) ('A' + i);
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }
}

        2.求出一个数组的最大值,并求到其下标

public class Hello {
    public static void main(String[] args) {
        int[] arr = {4, -1, 9, 10, 23};
        int max = 0, index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]>=max){
                max = arr[i];
                index = i;
            }
        }
        System.out.println("index:"+index+" max: "+max);
    }
}

三、数组赋值的机制

1.定义:       

        数组的默认是一个引用数据类型,赋值的是一个地址。

public class Hello {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3};
        int[] arr2 = arr1; //arr2的变化会影响arr1
        arr2[2] = 10;
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]); // 1 2 10
        }
    }
}

2.值传递 和 引用传递 的区别:

        

 3.数组拷贝:

        将int[] arr1 = {10,20,30} 拷贝到 arr2数组中。要求数据空间独立

public class Hello {
    public static void main(String[] args) {
        int[] arr1 = {10, 20, 30};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.print("arr1: "+ arr1[i]+'\t');
            System.out.print("arr2: "+ arr2[i]+'\t');
        }
    }
}

4.数组的翻转:

public class Hello {
    public static void main(String[] args) {
        //思路,新数组的长度最后一位值为后数组的第一位
        int[] arr1 = {11, 22, 33, 44, 55, 66};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[arr1.length-1-i] = arr1[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr2[i]+"");
        }
    }
}

5.数组的添加:

        案例:用户可以自行决定是否添加

import java.util.*;

public class Hello {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr1 = {}, arr2 = {};
        do {
            arr2 = new int[arr1.length + 1];
            for (int i = 0; i < arr1.length; i++) {
                arr2[i] = arr1[i];
            }
            System.out.println("please input int:");
            arr2[arr1.length] = sc.nextInt();
            arr1 = arr2;
            System.out.println("continue?please input yes/no:");
            if (sc.next().equals("no")) break;
        } while (true);
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i] + "\t");
        }
    }
}

四、数组排序

1.冒泡排序:

定义:一个一个往上走;        

总结:5个数据进行4次排序(外层),每一次排序确定一个元素的位置,前面的数大于后面的数进行交换,每一次少一个排序

public class Hello {
    public static void main(String[] args) {
        int[] arr = {24, 69, 80, 57, 13, 200};
        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 + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

 2.查找

        案例1:顺序查找:

import java.util.*;

public class Hello {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] names = {"pear", "apple", "banana", "tomato", "grape"};
        System.out.println("please input fruit name: ");
        String name = sc.next();
        boolean flag = false;
        for (int i = 0; i < names.length; i++) {
            if (name.equals(names[i])) {
                flag = !flag;
                System.out.println("suecess!!!,index: " + i);
            }
        }
        if (!flag) System.out.println("faith,not found");
    }
}

        案例2:二分查找(高级编程的时候讲)

五、二维数组

1.动态初始化:

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

public class Hello {
    public static void main(String[] args) {
        int[][] arr = new int[2][3];
        arr[1][1] = 8;
        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();
        }
    }
}

 2.静态初始化:

        定义:int[][] arr ={{0,0,0},{0,8,0}}

3.列不确定声明:

        定义:int[][] arr = new int[3][],arr[i] = new int[];

六、二维数组的遍历

案例1:遍历数组并求和:

public class Hello {
    public static void main(String[] args) {
        int[][] arr ={{4,6},{1,4,5,7},{-2}};
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
                sum+=arr[i][j];
            }
            System.out.println();
        }
        System.out.println("sum: "+sum);
    }
}

案例2:杨辉三角:

       注意:第三行开始有: arr[i][j] = arr[i-1][j-1] + arr[i-1][j]   (自己写的很6啊)

public class Hello {                                          //1
    public static void main(String[] args) {                  //1 1
        int[][] arr = new int[10][];                          //1 2 1
        for (int i = 0; i < arr.length; i++) {                //1 3 3 1
            arr[i] = new int[i + 1]; //开辟空间很六啊          //1 4 6 4 1
            for (int j = 0; j < arr[i].length; j++) {         //1 5 10 10 5 1
                //第三行开始有: arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
                if (i == j || j == 0) {
                    arr[i][j] = 1;
                }else{
                    arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
                }
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

 3.细节:       

        定义:二维数组声明   int[][] y(推荐) 或者  int[] y[] 或者  int y[][]

        二维数组是由一维数组构成

注意:int[] x,y[]; ===>x为一维数组,y为二维数组;

七、课后作业

好好理解上面的代码

相关文章:

  • 香橙派 C# IOT .net 引用WiringOP操作引脚高电平低电平 代码实例
  • 高等数学(第七版)同济大学 习题7-7 个人解答
  • Python每日一练(牛客数据分析篇新题库)——第33天:中位函数
  • 10. 元组、集合
  • 清理MySQL中的binlog
  • 计算机毕业设计ssm高校学科竞赛管理系统eolh8系统+程序+源码+lw+远程部署
  • MySQL索引相关知识整理学习
  • Linux——Linux指令2|more指令|less指令|head和tail指令|管道|时间相关的指令|date显示|Cal指令|find指令
  • rollback-only异常令我对事务有了新的认识
  • java基于Springboot+vue的学生公寓宿舍管理系统 elementui
  • MYSQL之外键约束
  • 单点登录和JWT的介绍与使用
  • C/C++ 遍历文件夹(最全方法)
  • 硬件设计基础----二极管
  • 图像处理那些算法
  • 《Java编程思想》读书笔记-对象导论
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular 响应式表单之下拉框
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • jdbc就是这么简单
  • js写一个简单的选项卡
  • V4L2视频输入框架概述
  • 猴子数据域名防封接口降低小说被封的风险
  • 欢迎参加第二届中国游戏开发者大会
  • 聚簇索引和非聚簇索引
  • 聊聊redis的数据结构的应用
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端工程化(Gulp、Webpack)-webpack
  • 听说你叫Java(二)–Servlet请求
  • UI设计初学者应该如何入门?
  • 阿里云ACE认证学习知识点梳理
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • (06)Hive——正则表达式
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (HAL库版)freeRTOS移植STMF103
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (六)vue-router+UI组件库
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)memcache、redis缓存
  • (轉貼) UML中文FAQ (OO) (UML)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net refrector
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET6实现破解Modbus poll点表配置文件
  • .net反编译的九款神器
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /etc/motd and /etc/issue
  • /etc/skel 目录作用