2011-02-02 93 views
30

如何從數組中刪除項目,然後將數組的大小調整爲較小的大小? 同樣,如果我需要添加另一個項目,如何增加容量?從數組和縮小數組中刪除項目

+0

是「數組」所需的數據結構爲你的使用情況?似乎你使用了錯誤的錘子 – 2011-02-02 06:53:37

回答

0

數組的大小是固定的,創建它們後無法重新調整大小。您可以通過設置它刪除現有的項目null

objects[4] = null; 

但你將無法刪除整個槽關閉陣列,如果你需要一個動態的1

減少其大小大小的數組,您可以使用ArrayList。有了它,你可以add()remove()對象,它會根據需要增長和縮小。

+0

所以我可以創建一個沒有我想要刪除的項目的新陣列? – Joe 2011-02-02 02:32:44

+0

@Joe:這也是一種可能的選擇;看看其他答案。 – BoltClock 2011-02-02 02:33:38

15

不能調整陣列本身,但您可以創建一個新的數組,並有效地利用了一些實用功能像這樣從舊陣列到新的數組中的元素複製:

public static int[] removeElement(int[] original, int element){ 
    int[] n = new int[original.length - 1]; 
    System.arraycopy(original, 0, n, 0, element); 
    System.arraycopy(original, element+1, n, element, original.length - element-1); 
    return n; 
} 

一但是,更好的方法是使用ArrayList(或類似的List結構)來存儲數據,然後使用其方法根據需要刪除元素。

+1

這段代碼有一個錯誤,它會導致它總是拋出一個NPE。我已經修復了編輯答案。 – Joel 2012-08-15 09:49:53

+0

第一個System.arraycopy方法調用不是必需的。 – Stuart 2016-04-10 18:32:38

1
object[] newarray = new object[oldarray.Length-1]; 

for(int x=0; x < array.Length; x++) 
{ 
    if(!(array[x] == value_of_array_to_delete)) 
    // if(!(x == array_index_to_delete)) 
    { 
    newarray[x] = oldarray[x]; 
    } 
} 

在創建數組後,無法縮小數組的大小,但可以將數組複製到另一個較小數組。

+0

如果我只是想忽略一個640字節數組的最後一個字節...... – aProgrammer 2012-08-21 11:30:51

+0

那麼你的實例化就是`object [] new array = new object [oldarray.Length-2];`for循環負責增量。 – Mike 2012-08-21 13:48:32

+0

我的意思是..我們是否需要創建一個新的數組,即使我們只是想忽略一個字節..我們不能縮小陣列嗎? – aProgrammer 2012-08-22 09:32:32

22

Java數組的大小在分配時是固定的,無法更改。

  • 如果你想「成長」或「收縮」現有的陣列,你必須分配適當大小的新數組和複製的數組元素;例如使用System.arraycopy(...)Arrays.copyOf(...)。複製循環也起作用,儘管它看起來有點笨重......海事組織。

  • 如果你想從一個數組中刪除一個或多個項目(在真正的意義上......不只是用null來代替它們),你需要分配一個新的更小的數組並複製你想要的元素保留。

有在第三方庫的形式(例如Apache的百科全書ArrayUtils)的替代品,但你可能要考慮是否有必要增加庫相關只是一種方法的緣故,你可以用5-10行代碼實現自己。


這是更好(即簡單...和在許多情況下,更有效的)使用List類而不是陣列。這將會照顧(至少)增長後備存儲。還有一些操作可以在列表中的任何位置插入和刪除元素。

例如,ArrayList類使用數組作爲後盾,並根據需要自動增長數組。它不會自動減小後備陣列的大小,但可以使用trimToSize()方法告訴它執行此操作;例如

ArrayList l = ... 
l.remove(21); 
l.trimToSize(); // Only do this if you really have to. 

1 - 我說的是「在很多情況下更有效」,因爲ArrayList使用一個簡單的「雙重規模」的策略時,它需要成長的支持數組。這意味着如果通過重複附加到列表來增加列表,每個元素將平均複製一次。相比之下,如果你對數組做了這樣的操作,你最終會將每個數組元素的拷貝數平均接近N/2次。

0

不使用System.arraycopy方法可以從一個數組具有下列

int i = 0; 
    int x = 0; 
    while(i < oldArray.length){ 
     if(oldArray[i] == 3)i++; 

     intArray[x] = oldArray[i]; 
     i++; 
     x++; 
    } 

刪除的元素,其中圖3是要刪除的值。

11

從org.apache.commons.lang使用ArrayUtils.removeElement(Object[],Object)是迄今爲止最簡單的方法。

int[] numbers = {1,2,3,4,5,6,7}; 
//removing number 1 
numbers =(int[])ArrayUtils.removeElement(numbers, 1); 
2

我已經創建了這個函數或類。林還挺新的,但我的朋友需要,這也讓我創造了這個:

public String[] name(int index, String[] z){ 
    if(index > z.length){ 
     return z; 
    } else { 
     String[] returnThis = new String[z.length - 1]; 
     int newIndex = 0; 
     for(int i = 0; i < z.length; i++){ 
      if(i != index){ 
       returnThis[newIndex] = z[i]; 
       newIndex++; 
      } 
     } 
     return returnThis; 
    } 
} 

由於其漂亮的revelant,我想我會在這裏發佈。

2

由於數組具有創建時分配的固定大小,因此唯一的選擇是創建一個沒有要移除的元素的新數組。

如果你想刪除的元素是最後一個數組元素,這成爲容易使用Arrays.copy實現:

int a[] = { 1, 2, 3}; 
a = Arrays.copyOf(a, 2); 

運行上面的代碼後,現在將指向只包含一個新的陣列1, 2.

否則,如果您要刪除的元素不是最後一個元素,則需要創建一個大小爲1的新數組,並將所有項目複製到它,但要刪除的項目除外。

上述方法效率不高。如果您需要管理內存中可變項目列表,最好使用列表。具體地,LinkedList將從O(1)的列表中移除項目(理論上可能最快)。

-1

您可以在創建數組時通過增加數組的大小來擴展數組,或者也可以在創建後更改大小,但要縮小或刪除元素。不創建新陣列的替代解決方案,可能是:

package sample; 

public class Delete { 
    int i; 
    int h=0; 
    int n=10; 
    int[] a; 
    public Delete() 
    { 
    a = new int[10]; 
    a[0]=-1; 
    a[1]=-1; 
    a[2]=-1; 
    a[3]=10; 
    a[4]=20; 
    a[5]=30; 
    a[6]=40; 
    a[7]=50; 
    a[8]=60; 
    a[9]=70; 
    } 
    public void shrinkArray() 
    { 
    for(i=0;i<n;i++) 
      { 
       if(a[i]==-1) 
        h++; 
       else 
        break; 
      } 
      while(h>0) 
       { 
        for(i=h;i<n;i++) 
        { 
         a[i-1]=a[i]; 
        } 
        h--; 
        n--; 
       } 
      System.out.println(n); 
    } 
    public void display() 
    { 
     for(i=0;i<n;i++) 
     { 
      System.out.println(a[i]); 
     } 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Delete obj = new Delete(); 
     obj.shrinkArray(); 
     obj.display(); 

    } 

} 

請評論任何錯誤!

-2

沒有使用任何預先定義的函數以及效率:--- >>

public static void Delete(int d , int[] array) 
{  
    Scanner in = new Scanner (System.in); 

    int i , size = array.length; 

    System.out.println("ENTER THE VALUE TO DELETE? "); 

    d = in.nextInt(); 

     for (i=0;i< size;i++) 
     { 
       if (array[i] == d) 
         { 


          int[] arr3 =new int[size-1]; 
          int[] arr4 = new int[i]; 
          int[] arr5 = new int[size-i-1]; 

            for (int a =0 ;a<i;a++) 
            { 
             arr4[a]=array[a]; 
             arr3[a] = arr4[a]; 
            } 
            for (int a =i ;a<size-1;a++) 
            { 
             arr5[a-i] = array[a+1]; 
             arr3[a] = arr5[a-i]; 

            } 


       System.out.println(Arrays.toString(arr3)); 

         } 
       else System.out.println("************");  


     } 

}