数组还是好说,学过一两门编程语言的就知道,需要注意的是数组声明时需要把大小给它定下来,比如声明一个字符串类型的数组:String str[]=new String[10];
但是问题就来了,每次都是大小确定的数组,我需要数组大小不固定随时变化怎么办呢?
动态数组就这样应运而生,龙哥给我们讲的是自己用代码写动态数组,并非用的ArrayList
看看字符串动态数组的写法:
package 数组与动态数组;
/**
* 动态数组:存放字符串的
*
* @author kowloon
*
*/
public class DynamicArray {
// 定义一个原始数组
String[] src = new String[0];
/**
* 将指定元素放入数组
*
* @param s
* 要放入的元素内容
*/
public void add(String s) {
//三个新概念
//容量、增长比率、可变数组长度(元素个数)
// 定义一个新数组,长度是原始数组长度+1
String[] dest = new String[src.length + 1];
// 将新元素放入新数组的最后一个下标位置
dest[dest.length - 1] = s;
// 将原始数组中的数据考入新数组
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}
// 将src指向新数组
src = dest;
}
/**
* 根据下标取出元素
*
* @param index
* 要取出的元素的下标
* @return 返回取得的元素
*/
public String get(int index) {
String s = src[index];
return s;
}
/**
* 获得数组中的元素个数
*
* @return 返回获得的元素个数
*/
public int size() {
return src.length;
}
/**
* 将指定的元素放入指定的位置
*
* @param s
* 要放入的元素
* @param index
* 元素所在的位置
*/
public void insert(String s, int index) {
//定义新数组 长度在原来的基础上加一
String[] dest1=new String[src.length + 1];
//从index号元素开始向后挪位置
for(int i=index;i<src.length;i++)
{
dest1[i+1]=src[i];
}
//把index前面的元素拷贝到新数组
for(int i=0;i<index;i++)
{
dest1[i]=src[i];
}
dest1[index]=s;
src = dest1;
}
/**
* 修改指定位置的元素
*
* @param s
* 修改后的新元素
* @param index
* 元素的位置
*/
public void modify(String s, int index) {
src[index]=s;
}
/**
* 删除指定位置的元素
*
* @param index
* 要删除的元素的位置
* @return 返回被删除的元素
*/
public String delete(int index) {
//新数组长度为原来的减一
String[] dest =new String[src.length-1];
//把被减的元素取出来等会儿返回它
String s=src[index];
//把index号元素之前的都复制给新数组
for(int i=0;i<index;i++)
{
dest[i]=src[i];
}
//把原数组index号元素后的复制到新数组
for(int i=index+1;i<src.length;i++)
{
dest[i-1]=src[i];
}
src=dest;
return s;
}
/**
* 删除指定的元素
* @param s 要删除的元素
*/
public void delete(String s){
}
}
总结:
总体来说呢,思想就是只要涉及到数组的长度需要增加或者减小的时候就必须用一个新的数组来代替原来的数组啦, delete的时候数组长度不是需要减小吗?所以在delete函数里面需要有一个String[] dest=new String[src.length-1]来代替原来的数组,这个新的数组的长度总是比原来的数组大小小1,所以new String[src,length-1] (src为原数组) ,删除的时候我们用的是指定的下标(index)来删除元素,怎么来删除这个元素呢?新是数组怎么来构造呢?很简单啦,只要index号元素前面的不变,用一个for循环把它们拷贝过来就行啦,接着再用一个for循环把除开index号元素外的元素按顺序全部拷贝到新数组,这样新数组里面就没有了index号元素了,最后不要忘记把原数组src指向新数组dest (src=dest;),其他的操作函数思想大致是一样的。