从零开始学JAVA(04):数组

一、数组的特点

  • 数组是相同类型的变量的集合,所有元素的类型都一样
  • 可以指定数组包含的元素个数,最多为int的最大值个
  • 元素有固定的顺序
  • 每个元素都有一个固定的编号,称之为索引(index),从0开始递增,类型为int
  • 可以像操作变量一样读写数组中的任何一个元素

二、创建和使用一个数组的语法

  • 数组元素类型[] 变量名 = new 数组元素类型[数组长度]
  • 变量名[索引] 可以使用这个变量,可以读取也可以给它赋值

三、数组实践

public class CreateArray {
    public static void main(String[] args) {
        int[] intArray = new int[100]; // 长度为100的数组
        System.out.println(intArray[10]); // 如果没有赋值,默认值为0

        double[] doubleArray = new double[100];
        System.out.println(doubleArray[20]); // 如果没有赋值,默认值为0.0

        intArray[20] = 100;
        System.out.println(intArray[20]);

        // 数组越界
        // 报错:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 101 out of bounds for length 100
        System.out.println(intArray[101]);
    }
}

四、数组的名与实

  • 数组的“实”是一块地址连续的内存,就像是编号连续的白纸一样
  • 数组的名,就是这个块连续内存的第一个内存的地址
  • 数据的变量和基本变量一样,本身是个地址,但是与变量不一样的是,这个地址的值,是数组的”名“,也就是数组的第一个地址
  • 数组 = 数组变量+数组的实体
  • 数组变量[索引]就是在数组原有地址的基础上,加上索引,获得想要的元素
  • 所以索引是从0开始的,因为数组变量的地址就是数组第一个元素的地址

五、数组的长度

  • 数组变量.length可以获得数组的长度
  • 与JavaScript不同的是,java中的数组一旦创建,其长度是不可变的
  • 数组越界的错误是ArrayIndexOutOfBoundsException
  • 数组里每个元素都有初始值,初始值和类型有关。对于int,初始值为0;对于Boolean,初始值为false
  • 数组变量可以指向新的数组实体。这时候,数组变量的值就是新的数组实体的地址了
  • 如果没有别的数组变量指向原来数组实体,原来的数组实体也就不可访问了
public class CreateArray {
    public static void main(String[] args) {
        int[] intArray = new int[100]; // 长度为100的数组
        System.out.println(intArray.length);
    }
}
public class CreateArray {
    public static void main(String[] args) {
        int[] intArray = new int[100]; // 长度为100的数组
        System.out.println(intArray.length); // 100

        intArray = new int[10];
        System.out.println(intArray.length); // 10
    }
}

六、二维数组

  • 二维数组是一维数组的延伸
  • double[][] double2Array = new double[5][10]
public class CreateArray {
    public static void main(String[] args) {
        double[][] double2Array = new double[5][3];
        for (int i = 0; i < double2Array.length; i++) {
            for (int j = 0; j < double2Array[i].length; j++) {
                double2Array[i][j] = Math.random() * 100;
                System.out.println(double2Array[i][j]);
            }
        }
    }
}

七、一个程序

import java.util.Scanner;

public class ScoreMaster {
    public static void main(String[] args) {

        // 声明六个变量, 分别代表六门科目的成绩
        int YuWenIndex = 0;
        int ShuXueIndex = 1;
        int WaiYuIndex = 2;
        int WuLiIndex = 3;
        int HuaXueIndex = 4;
        int ShengWuIndex = 5;

        int totalScoreCount = 6;

        // 每门课的名字
        String[] names = new String[totalScoreCount];
        names[YuWenIndex] = "语文";
        names[ShuXueIndex] = "数学";
        names[WaiYuIndex] = "外语";
        names[WuLiIndex] = "物理";
        names[HuaXueIndex] = "化学";
        names[ShengWuIndex] = "生物";

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入共有多少年的成绩:");

        int yearCount = scanner.nextInt();

        double[][] scores = new double[yearCount][totalScoreCount];

        for (int i = 0; i < yearCount; i++) {
            for (int j = 0; j < totalScoreCount; j++) {
                scores[i][j] = 80 + Math.random() * 20;
                System.out.println("第" + (i + 1) + "年" + names[j] + "成绩为:" + scores[i][j]);
            }
        }

        boolean cont = true;
        while (cont) {
            System.out.println("请选择要进行的操作:");
            System.out.println("1: 求某年最好成绩\n" +
                "2: 求某年的平均成绩\n" +
                "3: 求所有年份最好成绩\n" +
                "4: 求某门课历年最好成绩");

            int oprtId = scanner.nextInt();

            int year = 0;
            switch (oprtId) {
                case 1:
                    // 让用户输入指定的年份
                    System.out.println("请输入要计算第几年的最好成绩");
                    year = scanner.nextInt();
                    if (year <= 0 || yearCount < year) {
                        System.out.println("非法的年份:" + year);
                        cont = false;
                        break;
                    }
                    year = year - 1;
                    // 指定年份的最好成绩的编号,开始假设是0
                    int bestOfYearScoreId = 0;
                    // 循环指定年份的成绩,找出最好的成绩
                    // TODO:如果有两门课的成绩一样,而且都是最高的,怎么办?
                    for (int i = 1; i < totalScoreCount; i++) {
                        if (scores[year][bestOfYearScoreId] < scores[year][i]) {
                            bestOfYearScoreId = i;
                        }
                    }
                    System.out.println("第" + (year + 1) + "年成绩最好的科目为" + names[bestOfYearScoreId] + ",成绩为" + scores[year][bestOfYearScoreId] + "。");
                    break;
                case 2:
                    System.out.println("请输入要计算第几年的平均成绩");
                    year = scanner.nextInt();
                    if (year <= 0 || yearCount < year) {
                        System.out.println("非法的年份:" + year);
                        cont = false;
                        break;
                    }
                    year = year - 1;
                    double totalCountForAvg = 0;
                    for (int i = 0; i < totalScoreCount; i++) {
                        totalCountForAvg += scores[year][i];
                    }
                    double avgOfYear = totalCountForAvg / totalScoreCount;
                    System.out.println("第" + (year + 1) + "年的平均成绩为" + avgOfYear + "。");
                    break;
                case 3:
                    int bestYear = 0;
                    int bestScore = 0;

                    for (int i = 0; i < yearCount; i++) {
                        for (int j = 0; j < totalScoreCount; j++) {
                            if (scores[bestYear][bestScore] < scores[i][j]) {
                                bestYear = i;
                                bestScore = j;
                            }
                        }
                    }
                    // 视频中代码有错误,应该是使用 bestYear 而不是 year
                    System.out.println("所有年度最好成绩为第" + (bestYear + 1) + "年的" + names[bestScore] + ",成绩为" + scores[bestYear][bestScore] + "。");
                    break;
                case 4:
                    System.out.println("请输入科目编号");
                    int subjectId = scanner.nextInt();
                    if (subjectId <= 0 || totalScoreCount < subjectId) {
                        System.out.println("非法的科目编号:" + subjectId);
                        cont = false;
                        break;
                    }
                    subjectId = subjectId - 1;
                    year = 0;
                    for (int i = 1; i < yearCount; i++) {
                        if (scores[year][subjectId] < scores[i][subjectId]) {
                            year = i;
                        }
                    }
                    System.out.println("第" + (year + 1) + "年度" + names[subjectId] + "成绩最好,为" + scores[year][subjectId] + "。");

                    break;
                default:
                    cont = false;
                    System.out.println("不支持:" + oprtId + ", 程序结束。");
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/m0_47135993/article/details/128088038