返回顶部

java之数组

一 数组

  • 总结

栈: 先进后出
堆: 先进先出
​
局部变量在栈中
new 关键字创建的在堆中
​
栈不会做默认初始化: 所以局部变量在使用前, 一定要初始化
堆会做默认初始化: 数值类型为0, 字符为 '', boolean为false, 引用类型为null
​

 

1. 数组的定义

  • 数组是一个变量, 存储相同数据类型的一组数据

    • 声明一个变量就是在内存空间中划出一块合适的空间

    • 声明一个数组就是在内存空间划出一串连续的空间

2. 数组基本要素

  • 标识符

  • 数组元素

  • 元素下标

  • 元素类型

  • 数组长度固定不变, 避免数组越界,

  • 数组中的所有元素必须属于相同的数据类型

3. 使用数组

1. 声明数组: int[] a; // 告诉计算机数据类型是什么 
2. 分配空间: a = new int[5]; // 存放5个数字, 索引从0-4
    // 告诉计算机分配几个连续的空间
3. 赋值: a[0] = 8;
4. 处理数据: a[0] = a[0]*10;
数据类型[] 数组名 = new 数据类型[大小]; // 声明数组并分配空间

 

4. 数组的声明

语法格式:
数据类型[] 数组名;
数据类型 数组名[];
​
int[] myArray;
int myArray[];
char[] ch;
String[] strArray;

5. 数组的赋值

  • 方法1: 边声明边赋值

int[] arr = {1,2,3};
int[] arr1 = new int[]{1,2,3}; // 不能指定长度
  • 方法2: 动态的从键盘录入信息赋值

Scanner scanner = new Scanner(System.in);
for(int i = 0; i<20; i++){
    scanner[i] = scanner.nextInt();
}

 

6. 练习(1)

public static void main(String[] args) {
        // 数组存储5笔购物金额,在控制台输出并计算总金额
        System.out.println("请输入会员本月的消费记录: ");
        Scanner scanner = new Scanner(System.in);
        double[] shopArray = new double[5];
        
        for (int i = 0; i < 5; i++) {
            System.out.printf("请输入第%d笔的购物金额: ", (i + 1));
            shopArray[i] = scanner.nextDouble();
        }
        
        System.out.println("序号" + "\t\t" + "金额(元)");
        for (int i = 0; i < shopArray.length; i++) {
            System.out.println((i + 1) + "\t\t" + shopArray[i]);
        }
​
    }

 

7. 练习(2)

public static void main(String[] args) {
        // 从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分
        System.out.println("输入本次java考试五位学生的成绩: ");
        Scanner scanner = new Scanner(System.in);
        
        // 创建数组接收数据
        int[] scoresArray = new int[5];
        for (int i = 0; i < scoresArray.length; i++) {
            scoresArray[i] = scanner.nextInt();
        }
        
        // 默认是数组第一个元素最大
        int max = scoresArray[0];
        // 循环比较
        for (int i = 0; i < scoresArray.length - 1; i++) {
            if (scoresArray[i] < scoresArray[i + 1]) {
                max = scoresArray[i + 1];
            }
        }
        System.out.println("最大值为: " + max);
    }

 

8 练习 插入算法( 重点 )

// 有一组学员的成绩{99,85,82,63,60},将
// 它们按降序排列。要增加一个学员的成绩,将它
// 插入成绩序列,并保持降序
​
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] scores = { 99, 85, 82, 63, 60 };
​
        System.out.println("请输入你要插入的整数: ");
        int insert = scanner.nextInt();
​
        // 新建输入插入元素数组
        int[] newScores = new int[scores.length + 1];
        // 1. 确定插入值的下标
        // 默认下标是最后一个
        int index = newScores.length - 1;
        for (int i = 0; i < scores.length; i++) {
            if (insert > scores[i]) {
                index = i; // 保存下标
                break;
            }
        }
​
        // 2. 循环拷贝元素, 并插入新元素
        for (int i = 0; i < scores.length; i++) {
            if (i < index) {
                newScores[i] = scores[i];
            } else {
                newScores[i + 1] = scores[i];
            }
        }
        // 3. 插入新元素
        newScores[index] = insert;
​
        // 遍历新数组
        for (int n : newScores) {
            System.out.print(n + ",\t");
        }
        System.out.println();
        System.out.println(Arrays.toString(newScores));
    }

 

9. 练习(4)

// 求一个元素的下标
​
public static void main(String[] args) {
        int arr[] = { 1, 2, 5, 23, 67, 78, 3, 78, 34, 9, };
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入元素: ");
        int element = scanner.nextInt();
        
        // 定义初始下标-1
        int index = -1;
        // 如果元素有重复的话, 下标默认是最后一个元素的下标
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == element) {
                index = i;
            }
        }
        System.out.println(element + "元素的下标是" + index);
    }

 

10. 练习(5)

// 数组的交换
​
public static void main(String[] args) {
        int arr[] = { 1, 2, 5, 23, 12, 45, 45, 67 };
        // 遍历
        System.out.println("交换前: ");
        for (int n : arr) {
            System.out.print(n + "\t");
        }
        System.out.println();
​
        // 交换
        // 因为是交换, 所以循环数组一半
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            // arr[(arr.length - 1 - i)]表示从数组最后一位依次递减
            arr[i] = arr[(arr.length - 1 - i)];
            arr[(arr.length - 1 - i)] = temp;
        }
        System.out.println("交换后: ");
        for (int a : arr) {
            System.out.print(a + "\t");
        }
    }

 

11. 练习(6)

public static void main(String[] args) {
        // 需求说明: 求出4家店的最低手机价格
        System.out.println("请输入4家店的价格: ");
        Scanner price = new Scanner(System.in);
        double[] arr = new double[4];
        for (int i = 0; i < arr.length; i++) {
            System.out.println("第" + (i + 1) + "店的价格: ");
            arr[i] = price.nextDouble();
        }
        
        // 默认数组一个元素是最小值
        double min = arr[0];
        for (int i = 0; i < arr.length - 1; i++) {
            // 判断如果前一个元素比后一个大, 则把值赋值
            if (arr[i] > arr[i + 1]) {
                min = arr[i + 1];
            }
        }
        System.out.println("最低价格是: " + min);
    }

 

12. 练习( 冒泡排序 )

// 对五名学员成绩进行降序排序
public static void main(String[] args) {
        System.out.println("请输入5名学员的成绩: ");
        Scanner scanner = new Scanner(System.in);
        int[] scores = new int[5];
        for (int i = 0; i < scores.length; i++) {
            scores[i] = scanner.nextInt();
        }
        for (int i = 0; i < scores.length - 1; i++) {
            for (int j = 0; j < scores.length - 1 - i; j++) {
                if (scores[j] < scores[j + 1]) {
                    int temp = scores[j];
                    scores[j] = scores[j + 1];
                    scores[j + 1] = temp;
                }
            }
        }
        System.out.print("学员成绩按降序排序: ");
        for (int a : scores) {
            System.out.print(a + "\t");
        }
    }

 

13. Arrays类的应用

方法名称 说明
boolean equals(arr1,arr2) 比较两个数组是否相等
sort(arr1) 对数组arr1的元素进行升序排列
toString(arr1) 讲一个数组arr1转换成一个字符串
void fill(arr1, val) 把数组arr1所有元素都赋值为val
copyOf(arr1, length) 把数组arr1复制成一个长度为length的新数组,返回类型与复制的一样
binarySearch(arr1, val) 查询元素值val在数组array中的下标(要求数组中元素以及按升序排列)

14. 多维数组的应用

  • 三维及以上的数组很少使用

  • 主要使用二维数组

  • 从语法上java支持多维数组

  • 从内存分配原理的角度讲, 只有一维数组

15. 二维数组

  • <数据类型> [ ][ ] 数组名; 或者 <数据类型> 数组名 [ ][ ];

int[][] scores; // 定义二维数组
scores=new int[4][5]; // 分配内存空间,表示4行5列
​
// 定义二维数组时, 要定义最大维数
int[][] arr = new int[4][]
  • 二维数组实际上是衣蛾一维数组, 它的每个元素又是一个一维数组

  • 二维数组的定义

// 写法一
int[][] scores=new int[][]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }};
​
// 写法二
int scores[][] = {{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
​

 

16. 练习(二维数组)

public static void main(String[] args) {
        // 已知有3个班级各5名学员,请使用二维数组计算各个班级的总成绩
        int[][] arr = new int[3][5];
        Scanner scanner = new Scanner(System.in);
    
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("*****第%d个班*****", (i + 1));
            System.out.println();
            for (int j = 0; j < arr[i].length; j++) {
                System.out.printf("请输入第%d个学生的成绩: ", (j + 1));
                arr[i][j] = scanner.nextInt();
            }
        }
        int sum1 = 0;
        int sum2 = 0;
        int sum3 = 0;
    
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (i == 0) {
                    sum1 += arr[i][j];
                } else if (i == 1) {
                    sum2 += arr[i][j];
                } else if (i == 2) {
                    sum3 += arr[i][j];
                }
            }
        }
        System.out.println("1班总成绩: " + sum1);
        System.out.println("2班总成绩: " + sum2);
        System.out.println("3班总成绩: " + sum3);
    }
public static void main(String[] args) {
        int[][] intArray = new int[3][2];
        // 从键盘输入学生成绩,要求输入顺序与效果图一致
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < intArray.length; i++) {
            for (int j = 0; j < intArray[i].length; j++) {
                if (j == 0) {
                    System.out.printf("请输入第%d个学生的语文成绩: ", (i + 1));
                } else {
                    System.out.printf("请输入第%d个学生的数学成绩: ", (i + 1));
                }
                intArray[i][j] = sc.nextInt();
            }
        }
        sc.close();
        // 语文总成绩和语文平均分
        int sumMath = 0;
        int sum = 0;
        for (int i = 0; i < intArray.length; i++) {
            sum = sum + intArray[i][0];
            if (intArray[i].length >= 2) {
                sumMath += intArray[i][1];
            } else {
                System.out.println("没有第二个元素");
            }
        }
        System.out.println("语文总成绩是: " + sum);
        System.out.println("语文平均成绩是: " + (sum / intArray.length));
        System.out.println("数学的总成绩是: " + sumMath);
        System.out.println("数学的平均成绩是: " + (sumMath / intArray.length));
    }
posted @ 2023-04-11 22:05  fuju  阅读(68)  评论(0)    收藏  举报