2012-02-28 5 views
1

У меня есть следующая программа, в которой я добавляю несколько номеров для установки и списка, а затем их удаление. Может кто-нибудь объяснить, почему Set и list имеют другое поведение.Невозможно понять поведение следующей программы (с использованием коллекции 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

Set и List - это разные типы collections. Набор представляет собой ассоциативную коллекцию, поэтому Set.remove(i) удалит элемент, имеющий значение от i. Хотя List является индексированной коллекцией, поэтому List.remove(i) удаляет элемент на i th позиция в списке.

Итак, после удаления элементов с 0 по 3 из набора, содержащего элементы -3 ... 3, ваш набор будет предсказуемо содержать значения от -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 Помимо набора не допускается добавление дублированных элементов при их добавлении. –

+0

Спасибо, Питер, простите мое невежество, но я не могу его получить, для меня (элемент с индексом 0 равен -3, индекс 1 содержит -2, а индекс 2 содержит -1) извините, если я делаю что-то неправильно, но я действительно смущен , Поэтому он должен печатать [0 1 2] – Mike

+0

Awesome ... Super Like :) :) Большое вам спасибо Ты спас меня – Mike

0

При вызове Set.remove (int) java автоматически присваивает ваш параметр Integer, но существует List.remove (int), который удаляет значения по их индексу.