2013-05-19 82 views
0

它可能是明顯的東西,但不能合理化該代碼段的輸出。 參考:thisList.remove刪除奇怪的元素

public class Sample { 

    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); 
     } 
     System.out.println("After adding elements:"); 
     System.out.println(set + " " + list); 

     for (int i = 0; i < 3; i++) { 
      set.remove(i); 
      list.remove(i); 
     } 
     System.out.println("After removing elements:"); 
     System.out.println(set + " " + list); 
    } 
} 

輸出:

添加元素後:

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

刪除元素之後:

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

我期待:

刪除元素之後:

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

即list.remove(ⅰ)應實際上移除第一,列表中的第二和第三項。很公平 ?

回答

6

您更改,當你刪除第一個,讓你的代碼的行爲很有道理您的列表中元素的位置:

例如

for (int i = -3; i < 3; i++) { 
    set.add(i); 
    list.add(i); 
} 
System.out.println("After adding elements:"); 
System.out.println(set + " " + list); 

for (int i = 0; i < 3; i++) { 
    set.remove(i); 
    list.remove(i); 
} 

每次調用list.remove(I),該列表是由1項較小,且項目位置左移時間:這是在位置1移到位置爲0的項目,之一在位置2進入位置1等...

使用Iterator刪除元素或List的清除方法。

如果你想刪除基於它的價值的Integer對象,你的INT更改爲整型:

list.remove(Integer.valueOf(i)); 
+0

+1。我只是好奇,在循環內部設置'set.remove(0)'和'list.remove(0)'是否解決了這個問題?或者它仍然會有一個未定義的行爲? (醜陋的解決方案..但我只是想知道..) – Maroun

+0

@MarounMaroun:我在想它會的。 –

+0

@HovercraftFullOfEels感謝您指出迭代器的方式! – Kaunteya

3

號,以下行:

set.remove(i); 

需要你通過int類型和框到Integer對象(see here),然後它使用Integer equals()方法來確定哪個元素必須被刪除。發生這種情況的原因是在remove(int index) Set中沒有這種方法,但只有remove(Object o)這意味着基本類型「以某種方式」必須轉換爲Object,在Java中每個基元類型都有一個Wrapper類型,而「轉換」被稱爲自動裝箱。請注意,還有一個「現象」稱爲拆箱:)。

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

您在列表中的位置隨着每次刪除而改變。只需刪除位置'0'的3次。

1

Set要指定the object to remove和的情況下,因此,它實際上消除01並從該組2。因此你會得到其餘的元素。

List您指定the index of object to remove,因此它實際上消除在指數01並從列表2值的情況。因此你會得到其餘的元素。它的工作原理如下:

Initially (i=0): [-3, -2, -1, 0, 1, 2] 
       ^
        X 
Step 1 (i=1): [-2, -1, 0, 1, 2] 
        ^
        X 
Step 2 (i=2): [-2, 0, 1, 2] 
        ^
         X 
Result:  [-2, 0, 2] 
+0

好例證。 1+ –

0

有沒有想過這樣做的函數式編程方式?

//確保你所添加的兩種匹配和lambdaj靜態進口模擬下面的代碼

import static ch.lambdaj.Lambda.*; 
import static org.test.matcher.MatcherFactory.*; //this can be anything 

    List<Integer> original = Arrays.asList(1,2,3,4,5,6); 

    List<Integer> oddList = filter(odd, original); 

    for(int s : oddList){ 
    System.out.println(s); 
    } 
    //and it prints out 1,3,5 

並創建一個名爲MatcherFactory.java類

public class MatcherFactory { 

    public static Matcher<Integer> odd = new Predicate<Integer>() { 
     public boolean apply(Integer item) { 
       return item % 2 == 1; 
      } 
    }; 

    //put as many as matchers you want and reuse them 
} 

您也可以下載lambdaj庫從這裏開始

https://code.google.com/p/lambdaj/wiki/LambdajFeatures

並查看更多示例