04-数组作业

165 阅读9分钟

一、知识点(必做):

1. ArrayDemo1.java(重点)

需求:定义数组和数组的静态初始化操作

步骤:

(1)先定义后初始化数组(不能使用简写方式)

(2)定义数组,同时初始化

(3)打印数组长度

(4)数组赋值为空,并演示空指针错误

代码:

public class ArrayDemo1 {
    public static void main(String[] args) {
        // 需求:定义数组和数组的静态初始化操作
        /** 步骤
         * 1.先定义初始化数组 (不能使用简写方式)
         * 2.定义数组,同时初始化
         * 3.打印数组长度
         * 4.数组赋值为空,并演示指针错误
         */
​
        // 1.先定义初始化数组 (不能使用简写方式)
        int[] arr = new int[]{1, 2, 3, 4}; // 定义数组,同时初始化
        // int[] arr = {1,2,3,4,5}; 为了基础牢固,还是写一下简写方式
        // 2.打印数组长度
        System.out.println(arr.length); // 输出4
        // 数组赋值为空,并演示空指针错误
        int[] arr1 = null;
        System.out.println(arr1.length); // NullPointerException
        /** NullPointerException: 空指针异常 (空引用异常)
         *  操作了一个尚未初始化或者没有分配内存空间的数组
         */
    }
}

输出结果为:

4
Exception in thread "main" java.lang.NullPointerException
    at ArrayDemo1.main(ArrayDemo1.java:18)
​

(5)请在纸上画出以上代码的内存分析图

image-20220718190648056

2. ArrayDemo2.java(重点)

需求:数组的动态初始化和内存分析

步骤:

(1)动态初始化数组,并打印数组长度

(2)重新初始化数组,并打印数组长度

代码:

public class ArrayDemo2 {
    public static void main(String[] args) {
        // 需求:数组的动态初始化和内存分析
        /** 步骤
         * 1.动态初始化数组,并打印数组长度
         * 2.重新初始化数组,并打印数组长度
         */
        // 动态初始化数组
        int[] arr = new int[3];
            // 打印数组长度
        System.out.println(arr.length);
        // 重新初始化数组
        arr = new int[5];
            // 打印数组长度
        System.out.println(arr.length);
    }
}

执行结果:

3
5

(3)请在纸上画出以上代码的内存分析图

image-20220718191608258

3. ArrayDemo3.java(重点)

需求:数组的基本操作

步骤:

(1)定义一个数组nums,并静态初始化该数组

(2)定义一个变量size获取nums的数组长度

(3)获取数组元素

(4)设置数组元素

(5)遍历数组

public class ArrayDemo3 {
    public static void main(String[] args) {
        // 需求: 数组的基本操作
        /** 步骤
         * 1.定义一个数组nums,并静态初始化数组
         * 2.定义一个变量size获取nums的数组长度
         * 3.获取数组元素
         * 4.设置数组元素
         * 5.遍历数组
         */
        // 定义一个数组nums,并静态初始化数组
        int[] nums = new int[]{1, 2, 3, 4};
        // int[] nums = {1,2,3,4}; 简写方式
        // 定义一个变量size获取nums的数组长度
        int size = nums.length;
        // 获取数组元素,第一个元素
        int first = nums[0];
        System.out.println(first);
        // 设置数组元素,把第二个元素设置为6
        nums[1] = 6;
        // 遍历数组
        for (int index = 1; index < size; index++) {
            System.out.print(nums[index] + " ");
        }
    }
}

输出结果为

第一个元素1
1 6 3 4 

4. ArrayDemo4.java(重点)

需求:找出数组值元素22,在数组中第一次出现的索引位置

步骤:

(1)定义一个数组nums,并初始化该数组

(2)定义一个变量key,表示被搜索的元素

(3)遍历数组

(4)判断如果当前元素和key相等,证明找到元素,打印并结束循环

public class ArrayDemo4 {
    public static void main(String[] args) {
        // 需求: 找出数组值元素22,在数组中第一次出现的索引位置
        /** 步骤
         * 1.定义一个数组nums,并初始化数组
         * 2.定义一个变量key,表示被搜索的元素
         * 3.遍历数组
         * 4.判断如果当前元素和key相等,证明找到元素,打印并结束循环
         */
​
        // 定义一个数组nums,并初始化数组
        int[] nums = new int[]{11, 22, 33, 22, 33, 44, 55};
        // int[] nums = {11,22,33,22,33,44,55}; 简写方式
        // 定义一个变量key,表示被搜索的元素
        int key = 22;
        boolean has = false;
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            // 判断如果当前元素和key相等,证明找到元素,打印并结束循环
            if (nums[i] == key) {
                has = true;
                System.out.println(key + "第一次出现的索引位置为" + i);
                break; // 目的达到,撤退
            }
        }
        if (!has) {
            System.out.println(key + "不存在数组中");
        }
    }
}

输出结果为

22第一次出现的索引位置为1

5. ArrayDemo5.java(重点)

需求:求出int类型数组中最大元素值

步骤:

(1)定义并初始化数组nums

(2)定义一个变量max表示最大的元素,并假设nums的第一个元素为最大值

(3)使用foreach循环遍历nums数组

(4)判断如果遍历的元素和max比较,遍历的元素比较大,就将当前元素赋值给max

(5)遍历完成打印max

import java.util.Arrays;
​
public class ArrayDemo5 {
    public static void main(String[] args) {
        // 需求:求出int类型数组中最大元素值
        /** 步骤
         * 1.定义并初始化数组
         * 2.定义一个变量max表示最大的元素,并假设nums的第一个元素为最大值
         * 3.使用foreach循环遍历nums数组
         * 4.判断如果遍历的元素和max比较,遍历的元素比较大,就将当前元素赋值给max
         * 5.遍历完成打印max
         */
        // 定义并初始化数组
        int[] nums = {1, 3, 7, 2, 4, 9, 22, 11};
        // 定义一个变量max表示最大的元素,并假设nums的第一个元素为最大值
        int max = nums[0];
        /*// 使用for循环遍历nums数组
        for(int index = 0;index<nums.length;index++){
            if(nums[index]>max){
                max=nums[index];
            }
        }
        System.out.println("数组中最大元素值为" + max);*/
        // 使用foreach循环遍历nums数组
        for (int ele : nums) { // ele表示数组中的每一个元素
            if (ele > max) {
                max = ele;
            }
        }
        // 遍历完成打印max
        System.out.println("数组中最大元素值为" + max);
​
        /** 思路2:个人认为这种思路,要更清晰简单点
         * 1.直接对nums数组进行升序排序
         * 2.排序完成后,获取数组最后一个元素,最后一个元素即数组中最大元素值
         *      最后一个元素的索引为nums.length-1
         * 3.打印最大元素值
         */
        Arrays.sort(nums);
        int lastEle = nums[nums.length - 1];
        System.out.println("nums数组中最大元素值为" + lastEle);
    }
}

输出结果为

数组中最大元素值为22
nums数组中最大元素值为22

6.ArrayDemo6.java(重点)

需求:按照某种格式来打印出数组中的元素,打印效果为:[11,22,33,44,22,55]

步骤:

(1)定义并初始化数组nums

(2)定义一个字符串类型的变量str,用于拼接字符串

(3)遍历数组并拼接元素到str

(4)判断为最后一个元素拼接“]”,否则拼接“,”

(5)打印str

public class ArrayDemo6 {
    public static void main(String[] args) {
        // 需求:按照某种格式来打印出数组中的元素,打印效果为[11,22,33,44,22,55]
        /** 步骤
         * 1.定义并初始化数组nums
         * 2.定义一个字符串类型的变量str,用于拼接字符串
         * 3.遍历数组并拼接元素到str
         * 4.判断为最后一个元素拼接"]",否则拼接","
         * 5.打印str
         */
        // 定义并初始化数组nums
        int[] nums = {11, 22, 33, 44, 22, 55};
        // 定义一个字符串类型的遍历str,用于拼接字符串
        String str = "[";
        // 遍历数组并拼接元素到str
        for (int ele : nums) {
            // 判断为最后一个元素拼接"]",否则拼接","
            if (ele == nums[nums.length - 1]) {
                str += (ele+"]");
            } else {
                str += (ele + ",");
            }
        }
        // 打印str
        System.out.println(str);
    }
}

输出结果为

[11,22,33,44,22,55]

7. ArrayInArrayDemo.java

需求:演示二维数组的基本操作

步骤:

(1)定义一个二维数组

(2)静态初始化二维数组

(3)动态初始化二维数组

(4)获取二维数组的元素

(5)设置二维数组的元素

(6)for循环遍历并打印二维数组的元素

(7)foreach循环遍历并打印二维数组的元素

public class ArrayInArrayDemo {
    public static void main(String[] args) {
        // 演示二维数组的基本曹祖
        /** 步骤
         * 1.定义一个二维数组
         * 2.静态化初始二维数组
         * 3.动态化初始二维数组
         * 4.获取二维数组的元素
         * 5.设置二维数组的元素
         * 6.for循环遍历并打印二维数组的元素
         * 7.foreach循环遍历并打印二维数组的元素
         */
        // 定义一个二维数组
        int[][] nums = new int[][]{};
        // 静态初始化二维数组
        int[][] arr = {
                {1, 2, 3},
                {4, 5},
                {6}
        };
        // 动态初始化二维数组
        int[][] arr1 = new int[2][3];
        // 获取二维数组arr中的元素
        // for
        for (int i = 0; i < arr.length; i++) {
            // 取出每一个一维数组
            int[] Arr = arr[i];
            // 遍历一维数组
            for (int j = 0; j < Arr.length; j++) {
                int ele = Arr[j];
                System.out.print(ele + " ");
            }
            System.out.println();
            System.out.println("------------");
        }
        // foreach
        for (int[] Arr : arr) { // Arr为每一个一维数组
            for (int ele : Arr) { // ele为每个一位数组中的每一个元素
                System.out.print(ele + " ");
            }
            System.out.println();
            System.out.println("================");
        }
        // 设置二位数组中的元素arr[0][2],重新赋值为10
        arr[0][2] = 10;
        System.out.println(arr[0][2]);
    }
}

输出结果为

1 2 3 
------------
4 5 
------------
6 
------------
1 2 3 
================
4 5 
================
6 
================
10

二、综合练习(必做):

1. LocationDemo.java

需求:定义一个 int 类型数组,求出该数组索引是偶数的元素之和

思路:注意区分索引和元素

image-20200530163738868

public class LocationDemo {
    public static void main(String[] args) {
        // 需求:定义一个int类型数组,求出该数组索引式偶数的元素之和
        // 思路:注意区分索引和元素
        // 定义一个静态数组并初始化
        int[] arr = {11, 22, 33, 44, 55};
        // 定义sum变量接收数组中所有偶数之和,初始化为0
        int sum = 0;
        // for循环遍历
        for (int index = 0; index < arr.length; index++) {
            // 当索引为偶数时,让索引为偶数位置上的数与sum累加
            if (index % 2 == 0) {
                sum += arr[index];
            }
        }
        // 打印索引位置为偶数上的数之和
        System.out.println("索引位置为偶数上的数之和" + sum);
    }
}

输出结果为

索引位置为偶数上的数之和99

2.ReversedDemo.java

需求:定义一个元素为String类型数组,按照格式逆序打印该数组的元素,例如

数组内容为:{“A”,”B”,”C”,”D”},打印效果为:[D,C,B,A]

思路:

(1)索引从大到小逆序遍历

(2)字符串拼接

int a = 10;

String s = "";

public class ReversedDemo {
    public static void main(String[] args) {
        /** 需求:定义一个元素为String类型数组,按照格式逆序打印该数组的元素 ,例如
         * 数组内容为:{"A","B","C","D"},打印效果为: [D,C,B,A]
         */
        /** 思路
         * 1.索引从大到小逆序遍历
         * 2.字符串拼接
         */
        String[] arr = {"A", "B", "C", "D"};
        String str = "[";
        // 索引从大到小遍历
        for (int index = arr.length - 1; index >= 0; index--) {
            // 字符串拼接
            if (index == 0) {
                str += (arr[index] + "]");
            } else {
                str += (arr[index] + ",");
            }
        }
        // 打印str
        System.out.println(str);
    }
}
​

输出结果为

[D,C,B,A]

3. StatisticsDemo1.java

需求:定义一个 int 类型,长度为2的数组,其索引 0 位置存放指定数组索引为偶数的元素之和,索引 1 位置存放指定数组索引为奇数元素之和。

[1,2,3,4,5,6,7,8,9]

思路:

img

public class StatisticsDemo1 {
    public static void main(String[] args) {
        /*
        需求:定义一个int类型,长度为2的数组,其索引0位置存放指定
        数组索引为偶数的元素之和,索引1位置存放指定数组索引为奇数
        元素之和
        */
        // 静态初始化一个数组
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        // 动态初始化一个数组
        int[] arr1 = new int[2];
        // 给定两个变量,oddSum存放奇数和,evenSum存放偶数和
        int oddSum = 0;
        int evenSum = 0;
        // for循环遍历数组arr
        for (int index = 0; index < arr.length; index++) {
            if (arr[index] % 2 == 0) {
                evenSum += arr[index];
            } else {
                oddSum += arr[index];
            }
        }
        System.out.println("偶数之和" + evenSum);
        System.out.println("奇数之和" + oddSum);
        // 把oddSum,evenSum存放在数组arr1中
        arr1[0] = evenSum; // 存放偶数和
        arr1[1] = oddSum; // 存放奇数和
        String str = "{";
        for (int i = 0; i < arr1.length; i++) {
            if (i == arr1.length - 1) {
                str += (arr1[i] + "}");
            } else {
                str += (arr1[i] + ",");
            }
        }
        // 打印数组arr1
        System.out.println("数组arr1为" + str);
    }
}

输出结果为

偶数之和20
奇数之和25
数组arr1为{20,25}

4. StatisticsDemo2.java

需求:定义一个 int 类型的二维数组,统计数组元素值是 0 的的元素个数。

例如:二维数组:{{1,2,0,4,0},{0,3,5}}, 0的个数为3

public class StatisticsDemo2 {
    public static void main(String[] args) {
        // 需求:定义一个int类型的二维数组,统计数组元素值是0的元素个数
        // 例如:二位数组:{{1,2,0,4,0},{0,3,5}},0的个数为3
        // 定义一个int类型的二维数组
        int[][] arr = {
                {1, 2, 0, 4, 0},
                {0, 3, 5}
        };
        // 定义count变量记录0出现的次数,初始化为0
        int count = 0;
        // 利用嵌套循环对二维数组每个元素遍历
        for (int[] arr1 : arr) { // arr1表示每个一维数组
            for (int ele : arr1) { // ele表示每个一维数组的每一个元素
                if (ele == 0) {
                    count++;
                }
            }
        }
        System.out.println("0在二维数组arr中出现的次数为" + count);
    }
}

输出结果为

0在二维数组arr中出现的次数为3

5.StatisticsDemo3.java(选做)

需求:定义一个整型数组,将数组中的0去掉后返回一个新数组。

例如:数组为 int[] arr={1,13,45,5,0,0,16,6,0,25,4,17,6,7,0,15}; 要求将以上数组中为0的元素去掉,将不为0的值存入一个新数组,生成新的数组作为返回值: int[] newArr={1,13,45,5,16,6,25,4,17,6,7,15};

思路:

  1. 统计数组中元素不为0的元素个数length
  2. 定义一个新数组, 将上面统计得到的length作为新数组的长度
  3. 遍历原数组,将不为0的元素添加到新数组中(注意索引的控制)
public class StatisticsDemo3 {
    public static void main(String[] args) {
        /* 需求:定义一个整型数组,将数组中的0去掉后返回一个新数组
           例如:数组为 int[] arr={1,13,45,5,0,0,16,6,0,25,4,17,6,7,0,15};
           要求将以上数组中为0的元素去掉,将不为0的值存入一个新数组,生成新的数组作为
           返回值: int[] newArr = {1,13,45,5,16,6,25,4,17,6,7,15};
         */
        /** 思路
         * 1.统计数组中元素不为0的元素个数length
         * 2.定义一个新数组,将上面统计得到的length作为新数组的长度
         * 3.遍历原数组,将不为0的元素添加到新数组中(注意索引的控制)
         */
        // 给定一个数组arr
        int[] arr = {1, 13, 45, 5, 0, 0, 16, 6, 0, 25, 4, 17, 6, 7, 0, 15};
        // 定义变量length用来统计不为0的元素个数,初始化为0
        int length = 0;
        // foreach循环遍历数组arr
        for (int ele : arr) {
            // 判断不为0的元素,并统计个数
            if (ele != 0) {
                length++;
            }
        }
        System.out.println("数组arr中不为0的元素个数为" + length);
        System.out.println("将设置新数组newArr的长度为" + length);
        // 动态初始化一个新数组newArr,并设置长度为length
        int[] newArr = new int[length];
        // 定义变量j用来控制数组newArr的索引
        int j = 0;
        // 遍历数组arr
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                // 将数组arr中每个不为0的元素丢到数组newArr中
                newArr[j] = arr[i];
                j++;
            }
        }
        // 通过字符串的方式在控制台输出新数组的格式: int[] newArr={1,13,45,5,16,6,25,4,17,6,7,15}
        String str = "int[] newArr={";
        for (int arrEle : newArr) {
            System.out.print(arrEle + " ");
            if (arrEle == newArr[newArr.length - 1]) {
                str += arrEle + "}";
            } else {
                str += arrEle + ",";
            }
        }
        System.out.println();
        System.out.println("新数组为" + str);
    }
}

输出结果为

数组arr中不为0的元素个数为12
将设置新数组newArr的长度为12
1 13 45 5 16 6 25 4 17 6 7 15 
新数组为int[] newArr={1,13,45,5,16,6,25,4,17,6,7,15}

\