2012-02-28 70 views
1

我有下面的程序,我在其中添加了很少的數字來設置和列表,然後刪除它們,有人可以解釋爲什麼設置和列表具有不同的行爲。無法理解下列程序的行爲(使用java收集)

public class SetList { 
public static void main(String[] args){ 
    Set<Integer> set = new TreeSet<Integer>(); 
    List<Integer> list = new ArrayList<Integer>(); 
    for(int i=-3;i<3;i++){ 
     set.add(i); 
     list.add(i); 
    } 
    for(int i=0;i<3;i++){ 
     set.remove(i); 
     list.remove(i); 
    } 
    System.out.println(set+"   "+list); 
} 

}

和輸出

[-3, -2, -1]   [-2, 0, 2] 

我能夠理解集合的行爲,但無法瞭解列表輸出的行爲。所有幫助真的很感激。

回答

6

設置和列表是collections的不同類型。 Set是關聯集合,因此Set.remove(i)將刪除i元素。 List是索引集合,因此List.remove(i)將刪除列表中的i位置上的元素。

所以在從包含-3 ... 3元素的Set中移除元素0到3之後,您的Set將可預測地包含值-3到-1。

在列表中,相同的刪除序列的結果可能會更令人驚訝,但它實際上是合乎邏輯的。本來你的列表中包含:

Index 0 1 2 3 4 5 6 
Value -3 -2 -1 0 1 2 3 

list.remove(0)索引0刪除元素,導致

Index 0 1 2 3 4 5 
Value -2 -1 0 1 2 3 

注意,(刪除)第一已轉向一個前鋒的位置之後的所有元素!因此,當list.remove(1)刪除索引1處的元素時,它「跳過」元素-2。其結果是

Index 0 1 2 3 4 
Value -2 0 1 2 3 

類似地,下一個操作,list.remove(2) 「跳過」 的元素0,導致

Index 0 1 2 3 
Value -2 0 2 3 

而且最後,list.remove(3)移除最後一個元件,從而最終結果:

Index 0 1 2 
Value -2 0 2 
+0

+1旁邊的設置不允許添加重複的元素添加它們。 – 2012-02-28 17:20:34

+0

感謝彼得,原諒我的無知,但我無法得到它,對我來說(索引0的元素爲-3,索引1包含-2,索引2包含-1)對不起,如果我做錯了什麼,但我真的很困惑。所以它應該打印[0 1 2] – Mike 2012-02-28 17:24:23

+0

真棒...超級贊:) :)非常感謝你你救了我 – Mike 2012-02-28 17:32:12

0

當調用Set.remove(int)時,java會自動將您的參數設置爲一個Integer,但是存在一個List.remove(int),它將通過它們的索引來刪除這些值。