Невозможно понять поведение следующей программы (Использование коллекции Java) - PullRequest
1 голос
/ 28 февраля 2012

У меня есть следующая программа, в которой я добавляю несколько номеров для установки и перечисления, а затем удаляю их. Может, кто-нибудь объяснит, почему Set и list ведут себя по-разному.

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]

Я могу понять поведение Set, но не могу понять поведение вывода List. Вся помощь очень ценится.

Ответы [ 2 ]

6 голосов
/ 28 февраля 2012

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

Таким образом, после удаления элементов с 0 по 3 из набора, содержащего элементыиз -3 ... 3, ваш Set будет предсказуемо содержать значения от -3 до -1.

При использовании List результат той же последовательности удалений может быть немного более удивительным, но на самом деле этологичной.Первоначально ваш список содержит:

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 голосов
/ 28 февраля 2012

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

...