java 数组的扩容,缩容,插入元素,查找元素 详解(通俗易懂)

举报
Cyan_RA9 发表于 2023/04/03 16:30:00 2023/04/03
【摘要】 非常重要的java数组知识,帮助你更好的理解数组。

目录 

前言 : 

一个必须明白的事实(重要!) : 

数组的扩容 : 

        需求 : 

        思路 : 

        代码演示 : 

数组的缩容 : 

        需求 : 

        思路 : 

        代码演示 : 

数组元素的插入 : 

        需求 : 

        思路 : 

        代码演示 : 

数组元素的查找 : 

        需求 : 

        思路 : 

        代码演示 : 


前言 : 

        这篇博文将会和大家分享一下在java中如何实现数组的扩容,缩容,数组元素的插入和查找。首先,我们得知道,java中一个数组一旦被定义,它的长度就是固定的了。java也并没有提供可以直接改变数组长度的方法。所以我们并不能直接对数组进行这些操作,但是,我们可以通过去创建一个新数组去取代旧数组的方式来间接实现我们的需求,我们可以在取代的过程中完成我们的“小心思”。

一个必须明白的事实(重要!) : 

        关于Scanner类中的方法nextXxx() 和nextLine() 混用的问题 : 

        以nextInt方法为栗,nextInt方法会根据空白字符(如回车,换行,空格等)自动切断你输入的内容,而只保留输入流的第一部分并解析成int类型,其余内容会继续传递下去。而nextLine方法则以换行符作为分隔符。我们知道,在Windows系统下输入Enter键,达到的效果是/r/n,即一个回车键,一个换行键。

        所以,如果你同时使用了nextXxx方法和nextLine方法,且不巧地是,nextXxx方法恰好在nextLine之前,那你就要当心了。你的nextXxx后面的nextLine方法,其收到的内容很可能不是空就是乱七八糟的东西。原因就是我上述说的内容,假设你输入了一个int类型后,敲击Enter键,那么/r就是nextInt结束的标志,而/n就会被nextLine方法当作结束标志,所以此时你的nextLine方法什么都还没有收到就自动结束了,这也是新手常犯的错误之一。

        那么如何解决上述问题呢?其实也不是什么难事,你在nextXxx后面多加一条nextLine() 语句,把它吃剩的垃圾消化一下不就🆗了🐎?

        接下来up演示一段代码,我就在nextInt() 方法后面使用nextLine() 方法,给大家看看实际运行的效果如何,以及通过“消化”改善以后,运行效果如何:

package csdn;
/*
    注意nextXxx() 和 nextLine() 混用时的情况。
    空白字符: Tab,空格,回车符。
 */
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请尝试输入一个int类型:");
        int a = sc.nextInt();
        System.out.println("The value of a is : " + a);
        String s = sc.nextLine();
        System.out.println("The content of s is : " + s);
        if (s.isBlank()) {
            System.out.println("这™怎么接收为空啊");
        }
        if (s.isEmpty()) {
            System.out.println("这™怎么接收为空啊");
        }
        if (s.length() == 0) {
            System.out.println("这™怎么接收为空啊");
        }
        sc.close();
    }
}

image.gif

        我们先仅输入int类型值,看看运行效果如何

image.png

        通过运行可以看到,我们输入int类型的一个值后敲回车,还没输字符串啥的呢结果就自动给你蹦出来了,且字符串长度为0的判断为真。

        下面我们试试用空格作为间隔,即输入整型值后,空格,输入其他内容,最后再回车。运行效果如下图所示

image.png

        这次我们可以看到,第一次空格前我们输入的22,成功赋值给了整型变量a,而第一次空格后的输入内容,全都向后传递,真好被nextLine接收,赋值给了字符串变量s。可见我们的猜想是正确的。

数组的扩容 : 

        需求 : 

        给定一个随机类型的数组,以int类型为栗,实现数组的扩容,要求新增加的元素默认放在数组的末尾。而且要求可以任意次给数组扩容,并可以随时停止。        

        思路 : 

        1.首先,我们需要创建一个数组,充当已有的数组。接着,用一个变量来接收我们想要添加进数组中的元素。

        2.创建一个新数组,新数组的长度一定是比旧数组长度多1,以存放我们要添加的元素。利用for循环将旧数组的元素一一赋值给新数组,再将添加的元素赋值给新数组。最后只需要改变旧数组的指向,让它指向新数组即可。

        3.想要实现任意次扩容,随时停止,我们想到利用do-while循环,并添加if语句进行判断,触发机制可以自行设置,此处up以字符串是否相当为栗。

        代码演示 : 

package csdn.array.chinese;
import java.util.Scanner;
public class ArrayAddition {
    public static void main(String[] args) {
        int[] array = {5, 11, 23, 211, 985, 141};
        System.out.println("======原先数组的内容为:======");
        for (int i = 0; i < array.length; ++i) {
            System.out.print(array[i] + "\t");
        }
        System.out.println();
        do {
            System.out.println("请输入你想添加到数组中的元素 : ");
            Scanner sc = new Scanner(System.in);
            int wantNum = sc.nextInt();
            sc.nextLine();
            //不要忘记第19行代码"sc.nextLine();" 的作用。
            int[] arrNew = new int[array.length + 1];
            for (int i = 0, j = 0; i < array.length; ++i, ++j) {
                arrNew[j] = array[i];
            }
            arrNew[array.length] = wantNum;
            array = arrNew;
            //关键步骤 : 改变原数组的指向。
            System.out.println("======扩容后数组的内容为:======");
            for (int i = 0; i < array.length; ++i) {
                System.out.print(array[i] + "\t");
            }
            /*
                //System.out.print(arr[i] + "\t"); 注意这行代码 :
                如果此时制表符用单引号,就会被换算成AscII表值进行计算。
                所以此处的输出语句中必须使用双引号。
                加号+是关键,要记住加号+的两种用法。
            */
            System.out.println("\n还想添加吗?输入Yes确定继续,否则程序即会终止。");
            String trigger = sc.nextLine();
            if ("Yes".equals(trigger)) {
                continue;
            } else {
                sc.close();
                break;
            }
        } while (true);
    }
}

image.gif

        运行效果如下GIF图 : 

image.png

数组的缩容 : 

        需求 : 

        以int型数组为栗,要求默认将数组最后一个元素减去,且在数组长度大于1的情况下,可以任意次对数组进行缩容,当数组长度等于1时,不可再缩容,且需要给出提示。

        思路 : 

        1.同数组扩容类似,首先创建一个数组。但不同的是,数组的缩容不再需要定义变量来作接收。

        2.创建一个新数组,长度比旧数组少1,通过for循环将旧数组除去最后一个元素之外的元素一一赋值给新数组,最后改变旧数组的指向。

        3.仍然采用do-while循环来实现多次缩容。

        代码演示 : 

package csdn.array.chinese;
import java.util.Scanner;
public class ArraySubtraction {
    public static void main (String[] args) {
        int[] arr = {1, 2, 3, 4, 6, 7, 8, 131, 4635, 998};
        System.out.println("======初始数组为:======");
        for (int i = 0; i < arr.length; ++i) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
        System.out.println("现在开始对数组进行扩容,进行第一次扩容后 :\n");
        do {
            Scanner sc = new Scanner(System.in);
            int[] arrNew = new int[arr.length - 1];
            for (int i = 0,j = 0; i < arr.length-1; ++i,++j) {
                arrNew[j] = arr[i];
            }
            arr = arrNew;   //关键 : 改变旧数组的指向。
            System.out.println("======缩容后的数组为 :======");
            for (int i = 0; i < arr.length; ++i) {
                System.out.print(arr[i] + "\t");
            }
            System.out.println("\n如果还想继续缩容,请输入\"Yes\", 否则程序即会终止:");
            String trigger = sc.nextLine();
            if ("Yes".equals(trigger)) {
                continue;
            } else {
                sc.close();
                break;
            }
        } while (arr.length > 1);
        if (arr.length == 1) {
            System.out.println("你知道的,数组的长度必须大于0,所以,没有元素可以减了。");
        } else {
            System.out.println("拜拜拉~");
        }
    }
}

image.gif

        运行效果如下:

image.png

数组元素的插入 : 

        需求 : 

        设法准备一个升序的数组,输入一个你想插入到数组中的值。你需要确定该元素要插到数组中的哪个位置,以保证插入新元素后的数组仍是升序的数组。

        思路 : 

        1.要获取一个升序的数组,有多种思路,比如先获取一个任意排列的数组,然后采用冒泡排序法进行升序排列;也可以在for循环中增加判断,以保证你输入的值总比上一个元素的值大。当然,我们需要首先对数组的第一个元素进行单独地赋值,否则你在for循环进行比较时,第一个元素的值是一个垃圾值。

        2.数组的初始长度也可以通过Scanner类的方法手动设置。接着,怎么才能知道新元素要插在哪里呢,这里我们可以采用for循环来遍历数组,但在遍历的过程中进行比较,若发现了大于等于新元素的元素,就把它的索引返回,将来可以把新元素插在该索引处。即将新元素插在大于等于它的元素的前面。

        3.创建一个新数组,利用for循环来进行元素的替换。因为元素的插入是在数组中间完成的,因此,单一循环控制变量无法满足我们的需求,在for循环中我们使用两个变量,其中,j变量表示旧数组的索引,i变量表示新数组的索引。当i变量恰好等于我们之前找到的索引时,将新元素添加到新数组中,而此次循环不再对j变量自增,这样我们就可以实现j变量比i变量少循换一次,以使得后续的替换顺利完成。

        光说多少还是有点抽象,up给大家画一张图就全明白了:如下图

image.png

        其实就是在插入元素时将j跳过了一次。j比i要少自增一次。 

        代码演示 : 

package csdn.array.chinese;
import java.util.Scanner;
public class ArrayInsertion {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入初始数组的长度:");
        int len = sc.nextInt();
        int[] array = new int[len];
        System.out.println("请以升序的方式给数组初始化:");
        array[0] = sc.nextInt();
        for (int i = 1; i < array.length; ++i) {
            if ((array[i] = sc.nextInt()) >= array[i-1]) {
                continue;
            } else {
                System.out.println("错误! 请以升序输入:(你tm不会比大小?)");
                i--;
                continue;
            }
        }
        System.out.println("==============插入新元素前的数组如下:==============");
        for (int i = 0; i < array.length; ++i) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
        System.out.println("输入你想插入的元素:");
        int addition = sc.nextInt();
        int index = -1;
        for (int i = 0; i < array.length; ++i) {
            if (addition <= array[i]) {
                index = i;
                break;
            }
        }
        if (index == -1) {
            index = array.length;   //若数组中没有比新元素大的元素,插在数组的最后就可以
        }
        int[] arrayNew = new int[array.length + 1];
        //注意这个for循环,它实现了j比i少循环一次!
        for (int i = 0,j = 0; i < arrayNew.length; ++i) {
            if (index == i) {
                arrayNew[i] = addition;
                continue;
            } else {
                arrayNew[i] = array[j];
                j++;
            }
        }
        array = arrayNew;//改变原先数组的指向
        System.out.println("==============插入新元素后的数组如下:==============");
        for (int i = 0; i < array.length; ++i) {
            System.out.print(array[i] + " ");
        }
        sc.close();
    }
}

image.gif

        运行效果 : 

image.png

数组元素的查找 : 

        需求 : 

        创建一个数组,输入要查找的内容,若数组中存在该内容,返回它在数组处的索引值,否则提示找不到该元素。

        思路 : 

        1.以字符串数组为栗,创建一个字符串数组。

        2.利用for循环,在遍历数组的同时,用equals() 方法进行元素的判断.

        3.根据判断结果给出用户相应的提示。

        代码演示 : 

package csdn.array.chinese;
import java.util.Scanner;
public class Searching {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] nameBase = {"King", "Lrving", "Cyan", "Five", "Ice"};
        System.out.println("我们先来遍历一下数组:");
        for (String s : nameBase) {
            System.out.println(s);
        }
        System.out.println("请输入你要查找的元素:");
        String name = sc.nextLine();
        int index = -1;
        for (int i = 0; i < nameBase.length; ++i) {
            if (name.equals(nameBase[i])) {
                System.out.println("恭喜你找到了");
                System.out.println("它在数组中索引为:" + i);
                index = i;
                break;
            }
        }
        if (index == -1) {
            System.out.println("找不到这个元素呀!");
        }
        sc.close();
    }
}

image.gif

        运行效果 :

image.png

System.out.println("END----------------------------------------------------------------------------------"); 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。