2014-11-10 2 views
0

Почему повторное заполнение массива перед использованием метода удаления влияет на содержимое после использования метода remove?Эффекты повторного заполнения массиваList до/после использования метода удаления

Я пытаюсь удалить все элементы из ArrayList (элемент за элементом), начиная с самого высокого индекса. Причина копирования массива заключается в том, что я могу последовательно ссылаться на идентичный набор данных в других примерах кода позже (используя методы, которые изменяют массив), которые здесь не показаны.

Почему выходные данные отличаются для обоих этих примеров кода?

//populate arrrayList 
    for (int i = 0; i<1000; i++){ 
     int randNum = rand.nextInt(1000); 
     arrayList.add(randNum); 
    } 
    //create a identical arrayList for testing purposes 
    for (int i = 0; i<1000; i++){ 
     testArrayList.add(arrayList.get(i)); 

    // ...some other arrayList accessor methods here 

    //re-populate the testArrayList with original random numbers 
    for (int i = 0; i<1000; i++){ 
     testArrayList.add(arrayList.get(i)); 
    } 
    System.out.println("Contents of al: " + arrayList); 
    System.out.println("Contents of tal: " + testArrayList); 
    System.out.println(); 

    // ArrayList remove (low index to high index) 
    for (int i = 0; i < 1000; i++) { 
     testArrayList.remove(0); 
    } 
    System.out.println("Contents of al: " + arrayList); 
    System.out.println("Contents of tal: " + testArrayList); 
    System.out.println(); 

В приведенной выше версии вывод показывает, что оба массива содержат одни и те же элементы - (неожиданно).

В следующем коде я удаляю (то, что я думал просто избыточным) повторно заполняющим циклом, и вывод показывает, что второй массив под названием «testArrayList» пуст (как и ожидалось).

//populate arrrayList 
    for (int i = 0; i<1000; i++){ 
     int randNum = rand.nextInt(1000); 
     arrayList.add(randNum); 
    } 
    //create a identical arrayList for testing purposes 
    for (int i = 0; i<1000; i++){ 
     testArrayList.add(arrayList.get(i)); 

    } 
    System.out.println("Contents of al: " + arrayList); 
    System.out.println("Contents of tal: " + testArrayList); 
    System.out.println(); 

    // ArrayList remove (low index to high index) 
    for (int i = 0; i < 1000; i++) { 
     testArrayList.remove(0); 
    } 
    System.out.println("Contents of al: " + arrayList); 
    System.out.println("Contents of tal: " + testArrayList); 
    System.out.println(); 

Я понял, что цикл повторного населения в первом примере кода было просто излишним процесс и будет копировать содержимое ArrayList в testArrayList ПЕРЕД удалением элементов из testArrayList. Почему кажется, что цикл в первом примере repopulates testArrayList ПОСЛЕ кода, который следует за ним? Я ожидал, что оба этих примера кода выплюнут те же результаты. Может кто-нибудь объяснить, почему первый пример неэффективен при удалении элементов в testArrayList? Благодарю.

+0

Минимальный код примера –

+0

Действительно, для вашего же блага читайте javadoc List и ArrayList. Он имеет конструктор копирования, метод addAll() и метод clear(). Удаление с самого начала в цикле крайне неэффективно: оно заставляет список копировать все элементы снова и снова из индекса в индекс - 1. –

+0

Собственно, это и есть цель этого упражнения.Я демонстрирую именно то, что некоторые способы доступа и изменения содержимого ArrayList более эффективны, чем другие. Я удалил код, который я использую во время каждого типа цикла доступа, чтобы свести к минимуму количество кода и сосредоточиться на моем фактическом вопросе. – taky2

ответ

3

Код ниже добавляет 1000 элементов из arrayList в testArrayList

//create a identical arrayList for testing purposes 
for (int i = 0; i<1000; i++){ 
    testArrayList.add(arrayList.get(i)); 

Ниже код снова добавляет те же 1000 элементов из arrayList в testArrayList. Это неre-population, это добавлено больше в массив.

//re-populate the testArrayList with original random numbers 
for (int i = 0; i<1000; i++){ 
    testArrayList.add(arrayList.get(i)); 
} 

Re-population будет использовать set метод вместо метода add.

//re-populate the testArrayList with original random numbers 
for (int i = 0; i<1000; i++){ 
    testArrayList.set(i,arrayList.get(i)); 
} 

Теперь, когда вы удалите 1000 элементов из testArrayList, список будет пуст.

Включение @JBNizet комментарии, Лучший способ, чтобы добавить все элементы одной коллекции в списке будет вызывать addAll() метод, который присоединяет все элементы в указанной коллекции в конец списка, в порядок их возврата Итератором указанной коллекции.

Лучший способ удалить все элементы из списка - вызвать метод clear()arraylist, который удаляет все элементы из этого списка. После этого вызова список будет пустым.

+0

Включил этот комментарий в ответ. Это лучший подход. – BatScream

Смежные вопросы