题目:
java提供的数组有个特点: 当数组元素的个数确定后,就不能再追加元素了。
也就是说,数组的大小在创建的时候就固定了。
现在请你来写一个 智能数组类 SmartArray,它能够根据需要动态地分配空间。
实际上,它 只不过是在其它位置分配新的数组,然后把旧的数据拷贝过去。
请提供数组访问方法:
int get(int idx); // 返回指定位置的元素值
void set(int idx, int value); // 对指定的下标元素设置新值。当然,如果下标超出了原来数组的大小,则自动分配新的空间。
java提供的数组有个特点: 当数组元素的个数确定后,就不能再追加元素了。
也就是说,数组的大小在创建的时候就固定了。
现在请你来写一个 智能数组类 SmartArray,它能够根据需要动态地分配空间。
实际上,它 只不过是在其它位置分配新的数组,然后把旧的数据拷贝过去。
请提供数组访问方法:
int get(int idx); // 返回指定位置的元素值
void set(int idx, int value); // 对指定的下标元素设置新值。当然,如果下标超出了原来数组的大小,则自动分配新的空间。
代码:
class SmartArray
{
private int capacity; // 程序实际存储数据的数组大小
private int size; // 用户视角的数组大小
private int[] data; //工作数组
public SmartArray()
{
capacity = 16;
size = 0;
data = new int[capacity];
}
public int get(int idx)
{
return data[idx];
}
public void set(int idx, int value)
{
if(idx >= capacity){ // 重新分配,拷贝就数据
if(idx >= capacity* 2)
capacity = idx+1;
else
capacity = capacity * 2;
int[] dd = new int[capacity];
for(int i=0; i<size; i++){
dd[i] = data[i];
}
data = dd; //指向新数据,丢掉老数组
}
data[idx] = value;
if(idx+1>size) size = idx+1;
}
public int length() { return size; }
}
public class MyA
{
public static void main(String[] args)
{
SmartArray a = new SmartArray();
a.set(2,22);
a.set(3,33);
a.set(9,99);
a.set(15,1515);
for(int i=0; i<a.length(); i++){
System.out.println(i + ": " + a.get(i));
}
}
}