黑马程序员技术交流社区

标题: 在不考虑内存溢出的情况下用给固定数组实现无限添加功能 [打印本页]

作者: 雪风飞花    时间: 2015-4-23 22:00
标题: 在不考虑内存溢出的情况下用给固定数组实现无限添加功能
本帖最后由 雪风飞花 于 2015-4-23 22:07 编辑

问题:给定一个固定长度的数组,如何在不考虑内存溢出的情况下,对这个数组添加更多的值。如一个固定长度为5的数组,如何动态给这个数组添加5个以上的数据,比如说10个,20个?用一个方法实现这个功能。

这两天刚学完数组,老师就给我们留了一道扩展题。今天上自习课,花了2小时时间思考逻辑和编写代码终于写出来了,就上来献丑了,首先感谢我们的组长,给了我提点。让我思路更清晰。
首先,先讲讲思路和步骤
思路:
      1.要对这个固定数组实现扩展功能,就意味着我们要创建一个新的数组来存储原来这个旧数组,并且还要增加这个新数组的长度,所以我们就要创建一个相同类型的数组变量和一个数组。用这个变量来存储这个旧数组。
     2.考虑到这个数组是动态赋值的,所以我们要再定义一个变量动态的对这个数组对应的索引下标进行值添加。
     3.用while循环对这个数组进行动态的添加值,在这个循环中用"y/n"来判断是否退出数据的添加。如果停止输出再调用遍历数组的方法对值进行遍历输出数组中的值。
步骤:
      1.定义一个和数组类型相同的变量,如int 类型的数组和数组变量,再定义一个int类型的变量对数组下标进行自增,同时还要导入Scanner的包接受输入。
      2.明确方法中的返回类型,和参数类型。因为我们不需要对数据进行值的返回,所以就不需要返回值类型,既然我们要添加数据,所以就要定义一个参数实现对数据的添加
      3.判断这个数组的下标是否超过这个数组长度了,如果超过这个数组长度了,就将这个数组赋给那个数组变量,对给原来的那个数组变量赋予一个新的数组
      4.将原来那个数组中的数据赋给新数组,最后再调用自身。

下面来实现代码:

import java.util.Scanner;

public class ArrayAddTest {

        //定义初始一个静态数组arr长度为10
        private static int[] arr = new int[10];
        //定义一个新的数组变量
        private static int[] arr1 = {};
        //定义一个初始静态变量存储数组的下标
        private static int index = 0;
        public static void main(String[] args) {
                Scanner input = new Scanner(System.in);
                String str = null;
                while(!"N".equals(str) && !"n".equals(str)){
                        
                        //提示请输入数组中的数据
                        System.out.println("请输入要存入的数据:");
                        int a = input.nextInt();
                        //调用add方法
                        add(a);
                        //提示是否继续输入
                        System.out.println("是否继续输入(y/n)");
                        str = input.next();
                        //如果输入不正确就提示重新输入
                        while((!"y".equals(str)&&!"Y".equals(str))
                                &&(!"n".equals(str)&&!"N".equals(str))){
                                System.out.println("输入错误,请重新输入:");
                                str = input.next();
                        }
                }
                //输入结束后遍历数组
                eor(arr);        
        }
        public static void add(int i){
                //定义一个全局变量获取新数组的下标
                int a =0;
                //将i的值赋给数组,并且下标自增
                arr[index++] = i;
                /*
                 * 判断index是否大于数组的长度,如果大于则重新开辟一个数组
                 * 并将原来的数组的值赋给新数组
                 * 由于原来的数组下标越界后不能给原来的数组添加数据,
                 * 添加到新数组时数组下标会再次自增,
                 * 所以要对现在的数组下标自减后才能给新数组赋值按顺序赋值
                 * 判断后调用自身再次进行判断
                 **/
                if(index > arr.length-1){
                        //将原来的数组赋给一个新数组
                        arr1 = arr;
                        //创建新数组长度为原来的两倍
                        arr = new int[2*arr.length];
                        //将原来的数组中的值赋给新数组
                        for(a=0;a<arr.length;a++){
                                
                                arr[a] = arr1[a];
                                //当新数组的下标超过原来数组的下标时跳出循环,停止赋值操作
                                if(a>=(arr1.length-1)){
                                        break;
                                }        
                        }
                        //对新数组的索引值进行递减一次
                        index--;
                        //调用自身并从新添加数据
                        add(i);
                }
        }
        //遍历数组的方法
        public static void eor(int[] arra){
               for(int i =0; i<arra.length;i++){
                        System.out.println("这个数组"+ i +"角标的值是:"+ arr);
                }
        }
}





作者: 雪风飞花    时间: 2015-4-23 22:03
有什么需要改进的希望大家提出来,或者有不同的方法也可以说一下,解决方法多多益善:lol
作者: godrick007    时间: 2015-4-23 22:07
给力啊,楼主加油

作者: 雪风飞花    时间: 2015-4-23 22:09
:lol多谢顶贴
作者: msyx9871453    时间: 2015-4-23 22:11
:handshake:handshake
作者: 雪风飞花    时间: 2015-4-23 22:11
godrick007 发表于 2015-4-23 22:07
给力啊,楼主加油

:lol多谢顶贴
作者: li514620797    时间: 2015-4-23 22:11
给力,点赞。
作者: li514620797    时间: 2015-4-23 22:14
雪风飞花 发表于 2015-4-23 22:03
有什么需要改进的希望大家提出来,或者有不同的方法也可以说一下,解决方法多多益善 ...

/**
需求:
        提供方法add(int i),该方法可以给数组中的元素赋值,通过该方法可以无限次的给数组添加元素
        (不考虑内存溢出)
提示
        在class Demo{
                static int[] arr = new int[10];
                static int index = 0;
        }
        在Demo类中增加一个方法add(int i);

        add(int i){
               
                arr[index++] = i;
       
       
        }

1、数组的遍历
2、多个引用指向同一对象
3、计数器
*/
import java.util.Arrays;
class  Demo
{
        static        int[] arr=new int[10];
        static        int index = 0;
        public static void main(String[] args)
        {
                System.out.println(add(100).length);
        }

        public static int[] add(int i){
                arr[index++] = i;
                int[] arr1=Arrays.copyOf(arr,10+index);
                return arr1;
        }
}
作者: mxdeheima    时间: 2015-4-23 22:14
给你顶一下
作者: 雪风飞花    时间: 2015-4-23 22:17
li514620797 发表于 2015-4-23 22:14
/**
需求:
        提供方法add(int i),该方法可以给数组中的元素赋值,通过该方法可以无限次的给数组添加元素

:lol这个好,简便快捷
作者: silencelj    时间: 2015-4-23 22:20
总结的很好!继续!
作者: lclxjzz    时间: 2015-4-23 22:21
厉害·········
作者: 北京南瓜    时间: 2015-4-23 22:27
膜拜一下!
作者: wangyu    时间: 2015-4-23 22:29
好厉害,
作者: dengxing    时间: 2015-4-23 22:33
哇。楼主真有才啊!!!,这是后面的内容了吗
作者: 怪学究    时间: 2015-4-23 23:43
同样在学,我咋没明白啊
作者: 雪风飞花    时间: 2015-4-23 23:49
怪学究 发表于 2015-4-23 23:43
同样在学,我咋没明白啊

:lol多看两遍就明白了
作者: 黄文昭    时间: 2015-4-24 00:23
非常好!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2