• 数组


    • 数组的概述

    • 一维数组

    • 二维数组

    • 数组中常用的算法

    • Arrays工具类的使用

    • 数组总结案例

    1  数组的概述

    • 数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理;

    • 数组常见的概念:

      数组名

      下标或者索引

      元素

      角标,下标,索引

      数组的长度:元素的个数

    • 数组本身是引用数据类型,数组中可以是任何数据类型,包括基本数据类型和引用数据类型

    • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中应用的是这块连续空间的首地址

    • 数组长度一旦确定,就不能修改

    • 可以直接通过下标()或索引的方式调用指定位置的元素

    • 数组的分类:

      按照维度:一维数组,二维数组......

      按照元素的类型分:基本数据类型元素的数组,应用数据类型元素的数组(即对象数组)

    2  一维数组

    1.数组的声明

      静态

       数据元素类型 [] 数组名 = {元素};

      <!--数组的初始化和数组元素的赋值操作同时进行-->

      动态数据元素类型 [] 数组名 = new 数据元素类型 [元素];

      <!--数组的初始化和数组元素的赋值操作分开进行-->

    2.数组的赋值和调用

      <!--数组的下标都是从0开始的到数组的长度-1结束-->

      <!--除了跟数据库表打交道的时候是从1开始的-->

      数组名 [下标] = 值;

    3.遍历数组

     

    1 public class ArrayTest {
    2     public static void main(String[] args) {
    3         int [] id = {1,2,6,8};
    4         for (int i = 0; i < id.length; i++) {
    5             System.out.println(id[i]);
    6         }
    7     }
    8 }

    4.数组元素的默认初始化值

      数组元素是整型:0;

      数组元素是浮点型:0.0;

      数组元素是char类型:0或'u0000'

      数组元素是boolean类型:false

      数组元素是引用数据类型:null;

      局部变量放在栈内,new对象在堆中

    3-2-1 小案例

    package 数组;
    
    import java.util.Scanner;
    
    /*
     * 2. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
            成绩>=最高分-10    等级为’A’   
            成绩>=最高分-20    等级为’B’
            成绩>=最高分-30    等级为’C’   
            其余                               等级为’D’
            
            提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
    
     * 
     */
    public class ArrayDemo2 {
        public static void main(String[] args) {
            //1.使用Scanner,读取学生个数
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入学生人数:");
            int number = scanner.nextInt();
            
            //2.创建数组,存储学生成绩:动态初始化
            int[] scores = new int[number];
            //3.给数组中的元素赋值
            System.out.println("请输入" + number + "个学生成绩:");
            int maxScore = 0;
            for(int i = 0;i < scores.length;i++){
                scores[i] = scanner.nextInt();
                //4.获取数组中的元素的最大值:最高分
                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] + ",grade is " + level);
            }
            
        }
    }
    一维数组案例

    3   多维数组的使用

    <!--一维数组array1又作为另一个一维数组array2的元素而存在。其实从数组底层的运行机制来看,没有多维数组-->

    1.声明和初始化

    1 int [][] arr1 = new int [][] {{1,2,3},{4,5,6}};//静态
    2     String [][] arr2 = new String[3][2];//动态1
    3     String [][] arr3 = new String[3][];//动态2
    4     String [][] arr3 =[3][];//动态3 

    2.调用数组的指定位置的元素

    1 int a = arr1[0][1];
    2         System.out.println(a);

    3.获取数组的长度

    1 System.out.println(arr2.length);
    2         System.out.println(arr2[0].length);

    4.遍历数组

    for(int i = 0;i<arr1.length;i++) {
        for(int j = 0;j<arr1[i].length;j++) {
            System.out.print(arr1[i][j] + "  ");
                }
                System.out.println();
            }

    5.数组元素的默认初始化值

    1  针对于初始化方式一:
    2  比如:int[][] arr = new int[4][3];
    3  *      外层元素的初始化值为:地址值
    4  *      内层元素的初始化值为:与一维数组初始化情况相同
    5  *      
    6  针对于初始化方式二:比如:int[][] arr = new int[4][];
    7  *       外层元素的初始化值为:null
    8  *      内层元素的初始化值为:不能调用,否则报错。

    4   数组中涉及到的常见算法

    1.数组元素的赋值
    2.求数值型数组中元素的最大值,最小值,平均数,总和等
    public static void main(String[] args) {
            int [] arr = new int[10];
            int temp = arr[0] ;
            for (int i = 0; i < arr.length; i++) {
                arr[i] =(int) (Math.random()*90 + 10);
                System.out.print(arr[i] + "  ");
            }
            System.out.println();
            //最大值
            for (int i = 1; i < arr.length; i++) {
                if(temp < arr[i]) {
                    temp = arr[i];
                }
            }
            //最小值
            int min = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if( min >  arr[i]) {
                    min = arr[i]   ;
                }
            }
            //总和
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
            //平均数
            int avg = sum / arr.length;
            System.out.println("最大值是:" + temp);
            System.out.println("最小值是:" + min);
            System.out.println("总和是:" + sum);
            System.out.println("平均数是:" + avg);
        }
    3.数组的复制,翻转,查找(线性查找,二分法查找)

      复制

    public static void main(String[] args) {
            int [] arr2;
            int [] arr1 = {2,3,5,7,11,13,17,19};
            for (int i = 0; i < arr1.length; i++) {
                System.out.print(arr1[i] + "  ");
            }
            System.out.println();
            //赋值arr2变量等于arr1
            //数组的复制
            arr2 = new int [arr1.length];
            for (int i = 0; i < arr2.length; i++) {
                arr2[i] = arr1[i];
            }
            
            //输出arr1
            for (int i = 0; i < arr1.length; i++) {
                System.out.print(arr1[i] + "  ");
            }
            System.out.println();
        }

      查找

    //查找
            //线性查找
    String [] arr1 = {"AA","BB","CC","DD","EE"};
            String dest = "dd";
            boolean falge = true;
            for (int i = 0; i < arr1.length; i++) {
                if(dest.equals(arr1[i])) {
                    System.out.println("找到了,位置为:" + i);
                    falge = false;
                    break;
                }
            }
            if(falge) {
                System.out.println("很遗憾没找到");
            }
            
            //二分法查找(折半查找)
            //前提;所有查找的数组是有序的
            int [] arr2 = new int [] {-98,-34,2,34,54,66,79,105,333};
            int dest1 = -35;
            int head = 0;//初始索引
            int end = arr2.length-1;//结束索引
            boolean isFlage = true;
            while(head <= end) {
                int middle = (head + end)/2;//中间索引
                if(dest1 == arr2[middle]) {
                    System.out.println("找到了,位置为:" + middle);
                    isFlage = false;
                    break;
                }else if(arr2[middle] > dest1) {
                    end = middle - 1;
                }else {
                    head = middle + 1;
                }
            }
            if(isFlage) {
                System.out.println("没找到原因");
            }
        }
    View Code
    4.数组元素的排序算法

      衡量排序算法的优劣:

        时间复杂度,空间复杂度,稳定性

      排序算法的分类:

        内部排序

          整个排序过程不需要借助于外部存储器(磁盘),所有排序操作都是在内存中完成

        外部排序

          参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中必须借助外部存储器。外部排序最常见的是多路归并排序。可以认为外部排序是有多次内部排序组成。

      冒泡排序:

        通过对待排序序列从前往后,依次比较相邻元素的排序码,若发现逆序则交换,是排序码交到的元素逐渐从前向后移。

      冒泡小案例:

    public static void main(String[] args) {
            int [] arr = new int [] {10,89,52,36,8,44,22,18};
            //冒泡排序
            int temp = 0;
            for (int i = 0; i < arr.length - 1; i++) {//比较的次数
                for (int j = 0; j < arr.length-1 - i; j++) {//次数对应着i
                    //比较两个相邻的数
                    if(arr[j] > arr[j + 1]) {//从小到大
                        temp = arr[j];
                         arr[j] = arr[j + 1];
                         arr[j + 1] = temp;
                    }
                }
            }
            //遍历
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }

    5  Arrays工具类的使用

        Arrays是java.util.Arrays包下的,是操作数组的工具类

    常用方法:

        equals():判断连个数组是否相等

    int [] arr1 = new int [] {1,2,3,5};
            int [] arr2 = new int [] {1,3,2,5};
            boolean a = Arrays.equals(arr1, arr2);
            System.out.println(a);//false

        toString():输出数组信息

    System.out.println(Arrays.toString(arr1));//[1, 2, 3, 5]

        fill():将指定值填充到数组之中

    Arrays.fill(arr1, 10);
            System.out.println(Arrays.toString(arr1));//[10, 10, 10, 10]
            

        sort():对数组进行排序

    Arrays.sort(arr2);
            System.out.println(Arrays.toString(arr2));//[1, 2, 3, 5]

        binarySearch():堆排序后的数组进行二分法检索指定的值

    int [] arr3 = new int [] {-98,-34,2,34,54,66,79,105,333};
            int b = Arrays.binarySearch(arr3, 34);
            if(b >= 0) {
                System.out.println(b);//显示的是出现位置的下标
            }else {
                System.out.println("没找到");
            }

    6  数组使用中常见的异常

    1.

    数组下标越界:ArrayIndexOutOfBoundsException

    2.

    空指针异常:NullPointerException

    7 数组总结小案例

    package 数组;
    
    import java.util.Arrays;
    
    /*
     * 1.使用冒泡排序实现从小到大的排序
     * 2.反转上面的代码
     * 3.复制上述代码得到一个新的数组
     * 4.使用线性查找看一下22是否存在,如果存在返回下标否则提示
     * 5.常见的异常有哪些
     */
    public class Array {
        public static void main(String[] args) {
            int [] arr = new int [] {34,5,22,-98,6,-76,0,-3};
            //1.冒泡排序
            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;
                    }
                }
            }
            //遍历
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "  ");
            }
            System.out.println();
            //反转
            for (int i = 0; i < arr.length / 2; i++) {
                int temp1 = arr[i];
                arr[i] = arr[arr.length-1];
                arr[arr.length-1] = temp1;
            }
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "  ");
            }
            System.out.println();
            //复制
            int [] arr2 = new int [arr.length];
            for (int i = 0; i < arr2.length; i++) {
                System.out.print(arr2[i] + " ");
            }
            System.out.println();
            
            //使用线性查找看一下22是否存在,如果存在返回下标否则提示
            
            int bina = Arrays.binarySearch(arr2, 22);
            if(bina >= 0 ) {
                System.out.println("找到了哦,位置为:" + bina);
            }else {
                System.out.println("抱歉没找到");
            }
        }
    }
    View Code
  • 相关阅读:
    LeetCode155. 最小栈
    LeetCode154. 寻找旋转排序数组中的最小值 II
    LeetCode153. 寻找旋转排序数组中的最小值
    LeetCode152. 乘积最大子数组
    Python 异常值数据
    Python 生成周期性波动的数据 可指定数值范围
    VUE 组件 事件传递
    MyBatis-Plus And和Or的使用
    SQL Server 复制一条数据
    PLC扩展模拟量输入模块是什么
  • 原文地址:https://www.cnblogs.com/wyk1/p/14264961.html
Copyright © 2020-2023  润新知