2015-06-29 50 views
6

我想刪除一個ArrayList中索引爲0和1的元素。但它不起作用,我不知道方法。ArrayList刪除索引爲0和1的元素

的代碼如下

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Iterator; 


public class Test{ 

    public static void main(String[] args){ 
     Collection c = new ArrayList(); 

     c.add("A"); 
     c.add("B"); 
     c.add("C"); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 

     System.out.println(""); 
     c.remove(1); 
     c.remove(0); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 



    } 
} 

輸出是

A 
B 
C 

A 
B 
C 

但輸出應該

A 
B 
C 

C 

回答

6

我相信這是因爲你調用remove(INT)在Collection。 Collection沒有聲明方法remove(int),但是有remove(Object),所以java會將你的int自動裝箱到一個Integer中。但由於該整數不在集合中,所以沒有任何東西被刪除

2

我認爲你已經打了一個重要的教訓。

問題是收集不支持remove(int),只有remove(Object)。因此,編譯器將int作爲整數裝箱,該元素不在集合中,因此它不會將其移除。

如果您將集合聲明爲ArrayList,它將起作用。

0

集合僅僅是數據的集合,所以它們並不總是保持秩序。我建議用一個ArrayList

public class Test{ 


public static void main(String[] args){ 
    ArrayList c = new ArrayList(); 

    c.add("A"); 
    c.add("B"); 
    c.add("C"); 

    for(Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 

    System.out.println(""); 
    c.remove(1); 
    c.remove(0); 

    for(Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 



} 
} 
1

更換收集正如@ControlAltDel提到,Collection不支持remove(int)remove(Object)int被自動裝箱爲IntegerInteger不在集合中;所以沒有東西被刪除。

如果你想保留c作爲一個集合,那麼你可以使用Iterator.remove()刪除前兩個項目;像這樣:

public static void main(final String[] args){ 
    Collection<String> c = new ArrayList<>(Arrays.asList("A","B","C")); 

    for(String str : c) 
     System.out.println(str); 
    System.out.println(); 

    Iterator<String> it = c.iterator(); 
    it.next(); 
    it.remove(); 
    it.next(); 
    it.remove(); 

    for(String str : c) 
     System.out.println(str); 
} 
2

更改Ç的ArrayList因爲:

Collection.remove(對象o)

從此collection中移除指定元素的單個實例,如果它存在(可選操作)。更正式地,將刪除元素e (O == NULLé== NULL:o.equals(e))的

在上面,如果它是c.remove( 「A」);它會工作。寫作c.remove(1);正在查找要刪除的Integer對象。

ArrayList.remove(INT指數)

移除此列表中的指定位置的元素。將任何隨後的元素向左移(從其索引中減去一個元素)。

所以,你的程序應該是如下:

public class Test{ 

    public static void main(String[] args){ 
     ArrayList c = new ArrayList(); 

     c.add("A"); 
     c.add("B"); 
     c.add("C"); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 

     System.out.println(""); 
     c.remove(1); 
     c.remove(0); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 
    } 
} 
1

你真正需要的是

c.remove((String)"A"); 
c.remove((String)"B"); 

,而不是如果你想繼續使用Collection使用索引引用它們。原因相同的是,Collection中的remove方法預計爲Object參數。因此,當您編寫c.remove(0)時,它會在列表中搜索元素0並嘗試將其刪除。

請考慮性能折衷,而使用Collection而不是List這種情況。