我需要创建自己的数据结构,其中一部分是做一个ArrayList。我需要确保我可以在元素n处添加一个对象,同时向下推送所有其他对象。这是我的代码。现在它正在添加元素两次。它是函数public ReturnObject add(int index,Object item)。我需要这个函数来在指定的索引处添加对象,然后将其他对象向下移动。
public class ArrayList implements List{
public static final int CAPACITY=16;
private int size = 0;
private Object[] data;
ReturnObjectImpl ro;
//constructors
public ArrayList() {
data = new Object[CAPACITY];
} //CONSTRUCTS LIST WITH DEFAULT CAPACITY
public ArrayList(int capacity) { // constructs list with given capacity
data = new Object[capacity];
System.out.println("Created an ArrayList of capacity " + capacity);
}
public boolean isEmpty(){
if(size == 0) {
// System.out.println("The list is empty");
return true;
}
return false;
}
public int size(){
System.out.println("The ArrayList is not full, but currently has " + size + " indexs");
return size;
}
public ReturnObject get(int index){
ro = new ReturnObjectImpl(data[index]);
return ro;
}
public ReturnObject remove(int index){
return null;
}
public ReturnObject add(int index, Object item){
if(index <= size && index < data.length){
for (int x = size-1; x >= index; x--){
data[x+1] = data[x];
data[index] = item;
ro = new ReturnObjectImpl(data[index]);
size++;
}
System.out.println("Added to array at " + index);
}
return ro;
}
public ReturnObject add(Object item){
if (data[0] == null){
data[0] = item;
}
//int adding = size + 1;
data[size] = item;
System.out.println("Added item to index " + size);
size++;
return null;
}
//added - but DELETE BEFORE SUBMITTING
public void printAll(){
for(int x = 0; x < data.length; x++){
System.out.println(data[x]);
}
}
}
答案 0 :(得分:3)
显然,将对象插入该数组时:
for (int x = size-1; x >= index; x--){
data[x+1] = data[x];
data[index] = item;
应该在循环中发生不!插入应该只在正确的索引处发生一次!因此,即使您保持该循环移动其他元素,最后一次分配也应该 之后
所以重点是:你应该退一步,仔细看看这个循环对它的循环变量做了什么。
换句话说:要么拿一张纸并自己“运行”代码;或者在调试器中运行它。
由于这可能是某种家庭作业,我会留下它;它应该足以帮助您修复代码。
答案 1 :(得分:2)
除了GhostCat answer之外,您还可以使用for
移动System.arrayCopy()
而不是data
循环。右边的右边。您只需知道内部数组(System.arraycopy(this.data, insertIndex, this.data, insertIndex + 1, 1);
)是否已满。如果是,则必须展开内部数组。
if (data[0] == null) {
data[0] = item;
}
一些注意事项:
代码
ArrayIndexOutOfBoundsException
如果ArrayList(0)
被调用,将抛出if (size == 0) {
// System.out.println("The list is empty");
return true;
}
return false;
。
代码
return (size == 0);
可以改写为
ArrayIndexOutOfBoundsException
您似乎省略了更多检查,例如检查内部阵列是否已满。您当前的代码不会扩展内部数组,因此如果有人添加的对象数超过初始容量(默认值为16),则会抛出{{1}}。