时间:2021-05-20
我们都知道数组是线性的、类型固定、内存地址连续、定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据。而长度可变的数组是要将这个长度打破,实现数组数据无限增加
那么定义长度可变的数组就可以用两个数组来实现数组长度的变化。为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样 节省了开辟空间的时间
因为数组里的数据类型是不确定的,所以用泛型比较好
public class MyList<E> { private int rongliang;//容量 private int zengliang;//增量 private int num;//数量 //定义一个原数组 //Object类包含所有的类型,所以定义数组是用Object类 private Object[] src; //三个不同的构造方法 public MyList(){ this(10,10); } public MyList(int rongliang){ this(rongliang,10); } public MyList(int rongliang,int zengliang){ this.rongliang = rongliang; this.zengliang = zengliang; src = new Object[rongliang]; }}在MyList中实现在数组中添加数据,要考虑到数组中的数据数量小于数组长度时,可以直接在数组为null处添加数据,但当数组的数量大于等于数组长度时,要先重新定义一个数组,长度是原数组加增量,然后再添加数据
public void add(E s){ //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容 if(num>=src.length){ //定义一个新的数组,长度是原有的长度加增量 Object arr[] = new Object[src.length+zengliang]; //拷贝数组数据 System.arraycopy(arr, 0, arr, 0, src.length); src = arr; } //如果num不大于数组的长度,则不需扩容,直接加入 //如果num大于等于数组长度,则需执行上面的if语句扩容,再加入数据 //最后num++ src[num++] = s; }取出指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常
public E get(int index){ //抛出异常 if(index<0 || index>=num){ throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num); } //强制转换成E类型 return (E)src[index]; }修改指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常
public void modify(int index,E s){ //抛出异常 if(index<0 || index>=num){ throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num); } src[index] = s; }删除指定下标的数据,当数组中null值的长度大于等于增量时,要将数组的容量减小,防止浪费
public void delete(int index){ //抛出异常 if(index<0 || index>=num){ throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num); } //将>index的数据依次向前移动一位 System.arraycopy(src, index+1, src, index, num-index-1); num--; //减少容量的方法 if(src.length-num>=zengliang){ //定义一个新的数组,长度是原先数组的长度减去增量 Object arr[] = new Object[src.length-zengliang]; //拷贝数组 System.arraycopy(src, 0, arr, 0, num); src = arr; } }将指定下标处的数据改为指定的数据
public void insert(int index,E s){ //抛出异常 if(index<0 || index>=num){ throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num); } //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容 if(num>=src.length){ //定义一个新的数组,长度是原有的长度加增量 Object arr[] = new Object[src.length+zengliang]; //拷贝数组数据 System.arraycopy(src, 0, arr, 0, src.length); src = arr; } //将>index的数据依次向后移动一个位置 //arraycopy()是可以将数据自己拷贝给自己 System.arraycopy(src, index, src, index+1, num-index); //插入数据 src[index] = s; num++; }最后在写个获取数组中数据的个数,而不是数组的长度
public int size(){ return num; }写个测试类,来测试这个长度可变的数组是否可行
public class test { public static void main(String[] args) { //创建一个MyList对象 // 在创建对象时明确类型 MyList<String> list = new MyList<String>(); //添加数据 list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); list.add("f"); list.add("g"); list.add("h"); list.add("i"); list.add("j"); //遍历数组 for(int i=0;i<list.size();i++){ String s = list.get(i); System.out.print(s+" "); } System.out.println(""); int n = list.size(); System.out.println("数据个数为:"+n); System.out.println("**********************************************"); //修改指定位置的数据 list.modify(1, "QQ"); //遍历数组 for(int i=0;i<list.size();i++){ String s = list.get(i); System.out.print(s+" "); } System.out.println(""); int m = list.size(); System.out.println("数据个数为:"+m); System.out.println("**********************************************"); //删除指定位置的数据 list.delete(2); //遍历数组 for(int i=0;i<list.size();i++){ String s = list.get(i); System.out.print(s+" "); } System.out.println(""); int k = list.size(); System.out.println("数据个数为:"+k); System.out.println("**********************************************"); //在指定位置插入指定的数据 list.insert(3, "zr"); list.insert(3, "qi"); //遍历数组 for(int i=0;i<list.size();i++){ String s = list.get(i); System.out.print(s+" "); } System.out.println(""); int h = list.size(); System.out.println("数据个数为:"+h); System.out.println("**********************************************"); } }最终数组的结果为:
a b c d e f g h i j 数据个数为:10**********************************************a QQ c d e f g h i j 数据个数为:10**********************************************a QQ d e f g h i j 数据个数为:9**********************************************a QQ d qi zr e f g h i j 数据个数为:11**********************************************补充:在Java中创建一个自定义长度的数组并输入每个元素
用到知识点:数组、方法、Scanner、for循环。
作业:
package Array;import java.util.Scanner;public class InputArray {public static void main(String[] args) {shuzu();//方法调用 } //方法定义 public static void shuzu() { //将输入的数字作为数组的长度 Scanner sz = new Scanner(System.in); System.out.println("请输入数组长度:");//提示可以操作 int[] cd = new int[sz.nextInt()];//数组初始化完成 System.out.println("当前数组长度定义为:"+cd.length);//再提示一下结果 //用for循环为每一个元素赋值 for (int i = 0; i < cd.length; i++) { int q = i+1;//这里q用作提示,避免提示出第0个元素。 System.out.println("请输入第"+q+"个元素的值:"); cd [i] = sz.nextInt(); System.out.println("第"+q+"个元素定义为"+cd[i]+"。"); } sz.close(); //数组内各元素已经完成赋值,但是再用for循环遍历一次 System.out.print("数组内元素全部完成赋值:");//继续提示一下 for (int i2 = 0; i2 < cd.length; i2++) { if(i2 == cd.length-1) { System.out.print(cd[i2]+"。"); }else { System.out.print(cd[i2]+"、"); } } return;//方法结束,rentun; } }以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
php在用户自定义函数中支持可变数量的参数列表。在php5.5及更早的版本中,使用func_num_args(),func_get_arg(),func_get
python容器总结整理list可变数组tuple不可变数组dict键值对(key-value)的字典(dictionary)初始化:a={‘lyt':90}添
本文实例讲述了PHP实现动态获取函数参数的方法。分享给大家供大家参考,具体如下:PHP在用户自定义函数中支持可变数量的参数列表。其实很简单,只需使用func_n
集合定义集合,集合是java中提供的一种容器,可以用来存储多个数据。特点:数组的长度是固定的。集合的长度是可变的。集合中存储的元素必须是引用类型数据‘普通for
织梦默认的自定义字段调用是没有长度限制的,但是我们有些时候在列表页或者首页调用的时候就需要将自定义字段的长度限制一下,这样方便布局。下面就告诉大家限制自定义字段