2016-12-30 95 views
1

我需要製作自己的數據結構,並且其中一部分正在執行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]); 
     } 
    } 


} 
+1

「我需要製作自己的數據結構」爲什麼?你知道提供的數組列表的來源是[visible](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java/ )? – 2016-12-30 18:17:28

+0

可能是一項任務 – 2016-12-30 18:18:03

+0

您有一個循環,其目的是轉移元素。循環體將爲您需要移位的每個元素執行一次。你不想每次換一個都創造一個新的元素,是嗎?所以添加新元素的代碼需要移出循環。 – ajb

回答

3

顯然,在插入對象時到該數組:

for (int x = size-1; x >= index; x--){ 
    data[x+1] = data[x]; 
    data[index] = item; 

應該一個循環內發生!插入應該恰好發生一次,在正確的索引處!因此,即使當您保留該循環以移動元素時,最後一次分配應該在之後,即「移動循環」是而不是

所以重點是:你應該退後一步,仔細看看這個循環是如何處理循環變量的。

換句話說:或者拿一張紙並自己「運行」代碼;或者在調試器中運行它。因爲這可能是某種家庭作業活動,所以我會放棄它;它應該足以讓你去幫助你修復你的代碼。

+0

完美的答案。正是我需要的。感謝您的指導。非常感激。 – BitLord

2

除了GhostCatanswer,而不是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); 
    
  • 你似乎忽略更多的檢查,如檢查內部數組是否已滿。您當前的代碼不會擴展內部數組,因此如果添加了比初始容量更多的對象(默認值爲16),則會引發ArrayIndexOutOfBoundsException

+0

謝謝,我會更新它。 –

相關問題