三、Java数组、排序和查找

一、数组

可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即:数组就是一组数据

1、数组的创建

(1)动态初始化:

  • 方法一:
    在这里插入图片描述
    数组的下标从0开始
public class Array02 {
    public static void main(String[] args) {
        double[] scores = new double[5];
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("请输入第" + (i+1) + "个元素的值");
            scores[i] = scanner.nextDouble();
        }
        // 输出(遍历数组)
        System.out.println("当前数组内容如下");
        for (int i = 0; i < scores.length; i++) {
            System.out.println("第" + (i+1) + "个元素的值为" + scores[i]);
        }
    }
}

请输入第1个元素的值
100
请输入第2个元素的值
300
请输入第3个元素的值
45
请输入第4个元素的值
99
请输入第5个元素的值
97
当前数组内容如下
第1个元素的值为100.0
第2个元素的值为300.0
第3个元素的值为45.0
第4个元素的值为99.0
第5个元素的值为97.0

  • 方法二:
    在这里插入图片描述
public class Array02 {
    public static void main(String[] args) {
        double[] scores;
        scores = new double[5];
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("请输入第" + (i+1) + "个元素的值");
            scores[i] = scanner.nextDouble();
        }
        // 输出(遍历数组)
        System.out.println("当前数组内容如下");
        for (int i = 0; i < scores.length; i++) {
            System.out.println("第" + (i+1) + "个元素的值为" + scores[i]);
        }
    }
}

(2)静态初始化:
在这里插入图片描述

public class ArrayDetail {
    public static void main(String[] args) {
        /*
        1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
         */
        // int[] arr1 = {1, 2, 3, 60, 1.1}; //错误:1.1不是int类型
        double[] arr2 = {1.1, 2.2, 100};    // 正确:int可以自动转换为double

        /*
        2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
         */
        String[] arr3 = {"hi", "hello", "halo"};

        /*
        3. 数组创建之后,如果没有赋值,有默认值
            int:0, short:0, byte:0, long:0, float:0.0,
            double:0.0, char:\u0000, boolean:false, String:null.
         */
        short[] arr4 = new short[3];
        for (int i = 0; i < arr4.length; i++) {
            System.out.print(" " + arr4[i]);    // 0 0 0
        }

        /*
        4.使用数组的步骤:
            a,声明数组并开辟空间
            b,给数组各个元素赋值
            c,使用数组
        5. 数组的下标从0开始
        7. 数组属于引用类型,属性数据是对象(object)
         */

        /*
        6. 数组的下标必须在指定范围内使用,否则报:下标越界异常,比如
            int[] arr5 = new int[5]; 有效下标为[0,4]
            即数组的下标/索引 最小:0;最大:数组长度-1
            java.lang.ArrayIndexOutOfBoundsException
         */
        int[] arr5 = new int[5];
        // System.out.println(arr5[5]);
    }
}
public class ArrayExercise01 {
    public static void main(String[] args) {
        /*
        创建一个char类型的26个元素的数组,放置'A'-'Z'
        访问并打印所有元素
         */
        char[] chars = new char[26];
        for (int i = 0; i < chars.length; i++) {
            chars[i] =(char) ('A' + i); //'A'+i是int类型
        }
        for (int i = 0; i < chars.length; i++) {
            System.out.print(chars[i]);
        }
    }
}
public class ArrayExcercise02 {
    public static void main(String[] args) {
        /*
        求出一个数组int[]的最大值{ 4, -1, 9, 10, 23 }
        并得到对应下标
         */
        int[] arr = { 4, -1, 9, 10, 23 };
        int max = arr[0];
        int index = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max){
                max = arr[i];
                index = i;
            }
        }
        System.out.println("最大值:" + max + ";下标为:" + index);
    }
}

最大值:23;下标为:4

2、数组的赋值

在这里插入图片描述

public class ArrayAssign {
    public static void main(String[] args) {
        // 基本数据类型赋值,赋值方式为值拷贝(值传递)
        // n2的变化,不会影响到n1的值
        int n1 = 10;
        int n2 = n1;
        n2 = 1;
        System.out.println("n1=" + n1); //10
        System.out.println("n2=" + n2); //80

        // 数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用赋值
        // 传递的是一个地址=>arr2的变化会影响到arr1
        int[] arr1 = {1, 2, 3};
        int[] arr2 = arr1;  // 把arr1赋给了arr2
        arr2[0] = 10;
        System.out.println("arr1的值");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
}

n1=10
n2=1
arr1的值
10
2
3

在这里插入图片描述

3、数组拷贝

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

public class ArrayCopy {
    public static void main(String[] args) {
        int[] arr1 = {10, 20, 30};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr1[i];
        }
        arr2[1] = 99;
        System.out.println("修改arr2后查看arr2的值");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
        System.out.println("查看arr2的变化是否影响arr1");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
}

修改arr2后查看arr2的值
10
99
30
查看arr2的变化是否影响arr1
10
20
30

4、数组反转

把数组元素内容反转int[] arr = {11, 22, 33, 44, 55, 66, 77};

public class ArrayReverse {
    public static void main(String[] args) {
        int[] arr = {11, 22, 33, 44, 55, 66, 77};
        int temp = 0;
        int len = arr.length;
        for (int i = 0; i < len / 2; i++) {
            temp = arr[len - 1 - i];
            arr[len - 1 - i] = arr[i];
            arr[i] = temp;
        }
        for (int i = 0; i < len; i++) {
            System.out.print(" " + arr[i]);
        }
    }
}

77 66 55 44 33 22 11

5、数组添加元素

实现动态的给数组添加元素的效果,实现对数组扩容
1)原始数组使用静态分配 int[] arr = {1, 2, 3};
2)增加的元素,直接放在数组的最后 arr = {1, 2, 3, 4};

public class ArrayAdd {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        int[] arrNew = new int[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            arrNew[i] = arr[i];
        }
        arrNew[arrNew.length - 1] = 4;
        arr = arrNew;
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + " ");
        }
    }
}

1
2
3
4

3)用户可以通过如下方法决定是否继续添加,添加成功,是否继续?y/n。

public class ArrayAdd02 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        Scanner myScanner = new Scanner(System.in);
        do {
            int[] arrNew = new int[arr.length + 1];
            // 遍历arr数组,依次将arr元素拷贝到arrNew数组
            for (int i = 0; i < arr.length; i++) {
                arrNew[i] = arr[i];
            }
            System.out.println("请输入你要添加的元素");
            int addNum = myScanner.nextInt();
            // 将addNum赋给arrNew的最后一个元素

            arrNew[arrNew.length - 1] = addNum;
            // 让arr指向arrNew
            arr = arrNew;
            // 输出arr查看结果
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i] + " ");
            }
            // 是否继续添加
            System.out.println("是否继续添加?y/n");
            char key = myScanner.next().charAt(0);
            if ( key == 'n' ){
                break;
            }
        } while (true);
        System.out.println("已退出添加代码");
    }
}

请输入你要添加的元素
5
1
2
3
5
是否继续添加?y/n
y
请输入你要添加的元素
9
1
2
3
5
9
是否继续添加?y/n
n
已退出添加代码

6、数组的缩减

将数组 {1, 2, 3, 4, 5} 进行缩减,提示用户是否继续缩减,每次缩减最后的元素,当只剩下最后一个元素时,提示,不能再缩减

public class ArrayReduce {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        Scanner scanner = new Scanner(System.in);
        while (true){
            int[] arrNew = new int[arr.length - 1];
            for (int i = 0; i < arrNew.length; i++) {
                arrNew[i] = arr[i];
            }
            arr = arrNew;
            for (int i = 0; i < arrNew.length; i++) {
                System.out.println(arr[i]);
            }
            if (arrNew.length == 1){
                System.out.println("只剩一个元素,无法继续缩减,退出缩减循环");
                break;
            }
            System.out.println("是否继续缩减?y/n");
            char key = scanner.next().charAt(0);
            if (key == 'n'){
                System.out.println("缩减结束,退出缩减循环");
                break;
            }
        }
    }
}

1
2
3
4
是否继续缩减?y/n
y
1
2
3
是否继续缩减?y/n
y
1
2
是否继续缩减?y/n
y
1
只剩一个元素,无法继续缩减,退出缩减循环

1
2
3
4
是否继续缩减?y/n
y
1
2
3
是否继续缩减?y/n
n
缩减结束,退出缩减循环

二、排序

排序介绍:
在这里插入图片描述

1、冒泡排序

冒泡排序 (Bubble Sorting)的基本思想是: 通过对 待排序 序列从后向前 (从下标依次比较相邻元素的值,若发现逆序则交换,使值从较较大的元素开始),大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

特点:
在这里插入图片描述

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5, 4, 3, 2, 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;
                }
            }
            System.out.println("\n=== 第" + (i + 1) + "轮 ===");
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[j] + "\t");
            }
        }
        System.out.println("\n" + Arrays.toString(arr));
    }
}

=== 第1轮 ===
4 3 2 1 5
=== 第2轮 ===
3 2 1 4 5
=== 第3轮 ===
2 1 3 4 5
=== 第4轮 ===
1 2 3 4 5
[1, 2, 3, 4, 5]

三、查找

在这里插入图片描述

public class SeqSearch {
    public static void main(String[] args) {
        String[] names = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入名字");
        String findName = scanner.next();
        int index = -1;
        for (int i = 0; i < names.length; i++) {
            if (names[i].equals(findName)){
                System.out.println("找到:" + findName + ",下标为:" + i);
                index = i;
                break;
            }
        }
        if (index == -1){
            System.out.println("没有找到!!!");
        }
    }
}

请输入名字
who
没有找到!!!

请输入名字
金毛狮王
找到:金毛狮王,下标为:1

四、多维数组

二维数组:数组元素为一维数组的数组

int[][] arr = {{1,1,1},{2,2,2},{100}}	//正确
int[][] arr = {{1,1,1},{2,2,2},100}		//错误,100不是数组

应用场景:五子棋等……

1、动态初始化

方法一:
在这里插入图片描述

public class TwoDimensionalArray02 {
    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();
        }
    }
}

0 0 0
0 8 0

在这里插入图片描述
方法二:
在这里插入图片描述
方式二

public class TwoDimensionalArray02 {
    public static void main(String[] args) {
        int arr[][];
        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();
        }
    }
}

方式三

public class TwoDimensionalArray03 {
    public static void main(String[] args) {
        // 创建一个只确定一维数组个数,而未开辟一维数组空间的二维数组
        int[][] arr = new int[3][];
        for (int i = 0; i < arr.length; i++) {  //遍历arr的每个一维数组
            // 给每一个一位数组开辟空间
            // 如果没有给一维数组 new,则arr[i]就是null
            arr[i] = new int[i + 1];
            //遍历一维数组,并给一维数组每个元素赋值
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = i + 1;
            }
        }
        System.out.println("输出arr");
        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 = {{1,1,1},{2,2,2},{100}}

3、例题

在这里插入图片描述

public class YangHui {
    public static void main(String[] args) {
        int[][] yangHui = new int[10][];
        for (int i = 0; i < yangHui.length; i++) {  //遍历yangHui的每个元素
            //给每一个一维数组(行) 开辟空间
            yangHui[i] = new int[i + 1];
            //给每一个一维数组赋值
            for (int j = 0; j < yangHui[i].length; j++) {
                if (j == 0 || j == yangHui[i].length - 1){
                    yangHui[i][j] = 1;
                } else {
                    yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];
                }
            }
        }
        // 输出杨辉三角
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package array;
/*
已知有一个升序的数组,要求插入一个元素,该数组顺序仍然是升序,比如:
[10, 12, 45, 90],插入23后,数组为[10, 12, 23, 45, 90]
 */
public class InsertArr {
    public static void main(String[] args) {
        int[] arr = {10, 12, 45, 90};
        int insertNum = 23;
        int index = -1; //要插入的位置
        int[] arrAdd = new int[arr.length + 1];
        //遍历arr数组,如果发现insertNum<=arr[i],说明i就是要插入的位置
        //使用index保留,index = i;
        //如果遍历完后,没有发现insertNum<=arr[i],说明index = arr.length
        //即,添加到arr的最后
        for (int i = 0; i < arr.length; i++) {
            if (insertNum <= arr[i]){
                index = i;
                break;  // 找到位置后,就退出
            }
        }
        //判端index的值
        if (index == -1){   //说明没有找到位置
            index = arr.length;
        }
        System.out.println("index = " + index);

        //将arr的元素拷贝到arrNew,并且要跳过index位置
        //j用来控制arr数组的下标
        for (int i = 0, j = 0; i < arrAdd.length; i++) {
            if (i != index){    //说明该位置拷贝的是arr中的元素
                arrAdd[i] = arr[j];
                j++;
            } else {
                arrAdd[i] = insertNum;
            }
        }

        arr = arrAdd;
        //打印扩充后的arr
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
}

index = 2
10 12 23 45 90

package array;

import java.util.Arrays;

/*
随机生成1-100 的10个整数到数组中,倒序打印,求:
平均值、最大值、最大值的下标、查找里面是否有8.
 */
public class Ex {
    public static void main(String[] args) {
        int[] arr = new int[10];
        double sum = arr[0];
        int max = arr[0];
        int maxIndex = 0;
        int findNum8 = 8;
        int findNum8Index = -1;
        for (int i = 0; i < 10; i++) {
            //要将"*100"也括起来,否则只强转Math.random(),结果始终为0
            arr[i] = (int)(Math.random()*100) + 1;
        }
        System.out.println("随机生成arr数组:" + Arrays.toString(arr));
        //倒序
        System.out.println("=====");
        for (int i = arr.length - 1; i >= 0; i--) {
            System.out.print(arr[i] + "\t");
        }

        //平均值、最大值、最大值下标
        for (int i = 1; i < arr.length; i++) {
            sum += arr[i];
            if (max < arr[i]){
                max = arr[i];
                maxIndex = i;
            }
        }
        System.out.println("\nmax=" + max + ";maxIndex=" + maxIndex);
        System.out.println("平均值:" + sum/arr.length);

        //查找数组中是否有8
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == findNum8){
                System.out.println("找到了数字" + findNum8 + ",下标为:" + findNum8Index);
                findNum8Index = i;
                break;
            }
        }
        if (findNum8Index == -1){
            System.out.println("未找到数字" + findNum8);
        }
    }
}

随机生成arr数组:[79, 23, 89, 67, 90, 52, 92, 46, 25, 32]
32 25 46 92 52 90 67 89 23 79
max=92;maxIndex=6
平均值:51.6
未找到数字8

/*
冒泡排序———倒序
*/
public class Ex {
    public static void main(String[] args) {
        int[] arr = {73, 24, 66, 82, 12, 47, 87, 17, 23, 10};
        int temp = 0;
        for (int i = 0; i < arr.length; 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;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

[10, 12, 17, 23, 24, 47, 66, 73, 82, 87]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值