我在我的数组中获取空​​值

时间:2014-10-20 18:17:34

标签: java arrays

我正在玩一个ArrayList,并试图让它每次超过它的大小时增长两倍。这是我的添加方法:

public class ArrayExpander
{
   private int size;
   private int noOfItems;
   private Object[] store;
   private final int INITIALSIZE = 2;

   public ArrayExpander()
   {
      store = new Object[INITIALSIZE];
      noOfItems = 0;
      size = INITIALSIZE;
   }

   public void add(Object obj)
   {
      growBufferIfNecessary();
      store[size++] = obj;
      /*for (int i = size - 1; i < store.length; i++)
      {
         store[i] = store[i - 1];
         store[i] = obj;
      }*/   
   }

   public String toString()
   {
      String temp = "[" + store[0];
      for (int i = 1; i < size; i++)
      {
          temp = temp + "," + store[i];
      }
      temp = temp + "]";
      return temp;
   }
   private void growBufferIfNecessary()
   {
      if (size == store.length)
      {
         Object[] newStore = new Object[2 * store.length];
         for (int i = 0; i < store.length; i++) 
         { 
            newStore[i] = store[i]; 
         }      
         store = newStore;
      }
   }
   public static void main(String[] args)
   {
      ArrayExpander ae = new ArrayExpander();
      //System.out.println(ae);
      ae.add("a");
      ae.add("b");
      System.out.println(ae);
      ae.add("c");
      ae.add("d");  
      ae.add("e");
      ae.add("f");
      ae.add("g");
      ae.add("h");  
      System.out.println(ae);
      ae.add("i");
      System.out.println(ae);
   }
}

这是我的输出:

[null,null]
[null,null,a,b]
[null,null,a,b,c,d,e,f,g,h]
[null,null,a,b,c,d,e,f,g,h,i]

我无法弄清楚为什么我会得到空语句。第一行应该是a,b,然后arraylist应该加倍,并且是a,b,c,d。我把它设置为最终int INITIALSIZE = 2。 我正在寻找的输出是

[a,b]
[a,b,c,d]
[a,b,c,d,e,f,g,h]
[a,b,c,d,e,f,g,h,i,null,null,null,null,null,null,null]

2 个答案:

答案 0 :(得分:2)

此代码适合您。 size应该是指数组的大小,而noOfItems是指数组中的项数。你有点混合2。我只在你的add()和growBufferIfNecessary()中改变了一些东西。

public class ArrayExpander
{
   private int size;
   private int noOfItems;
   private Object[] store;
   private final int INITIALSIZE = 2;

   public ArrayExpander()
   {
      store = new Object[INITIALSIZE];
      noOfItems = 0;
      size = INITIALSIZE;
   }

   public void add(Object obj)
   {
      growBufferIfNecessary();
      store[noOfItems++] = obj;
   }

   public String toString()
   {
      String temp = "[" + store[0];
      for (int i = 1; i < size; i++)
      {
          temp = temp + "," + store[i];
      }
      temp = temp + "]";
      return temp;
   }
   private void growBufferIfNecessary()
   {
      if (noOfItems == size)
      {
         size = 2 * size;
         Object[] newStore = new Object[size];
         for (int i = 0; i < store.length; i++) 
         { 
            newStore[i] = store[i]; 
         }      
         store = newStore;
      }
   }
   public static void main(String[] args)
   {
      ArrayExpander ae = new ArrayExpander();
      //System.out.println(ae);
      ae.add("a");
      ae.add("b");
      System.out.println(ae);
      ae.add("c");
      ae.add("d");  
      ae.add("e");
      ae.add("f");
      ae.add("g");
      ae.add("h");  
      System.out.println(ae);
      ae.add("i");
      System.out.println(ae);
   }
}

试试这个。如果你注意到我用noOfItems替换了几个斑点的大小。你真的很亲近你只需改变一些事情。

答案 1 :(得分:1)

使用循环手动复制数组非常痛苦,请使用System.arraycopy(Object,int,Object,int,int)之类的

private int size = 0;
private Object[] store = new Object[INITIALSIZE];
private void growBufferIfNecessary() {
    if (size >= store.length) {
        Object[] newStore = new Object[2 * store.length];
        System.arraycopy(store, 0, newStore, 0, store.length);
        store = newStore;
    }
}

我淘汰了noOfItems。您不需要它,您的add方法只是

public void add(Object obj) {
    growBufferIfNecessary();
    store[size++] = obj;
}

最后,您的toString()可以使用Arrays.copyOf(T[], int)之类的

@Override
public String toString() {
    return Arrays.toString(Arrays.copyOf(store, size));
}

然后我得到了你的预期输出

[a, b]
[a, b, c, d, e, f, g, h] 
[a, b, c, d, e, f, g, h, i]