在数组列表中的索引处添加值

时间:2016-12-30 18:09:03

标签: java arraylist

我需要创建自己的数据结构,其中一部分是做一个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]);
        }
    }


}

2 个答案:

答案 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}}。