2014-10-07 3 views
2
public static ArrayList<String> remove(ArrayList<String> list, int a) { 

    for(int i = 0; i < list.size(); i++){ 
      list.remove(i); 
    } 
    return list; 
} 

Почему этот код не удаляет все элементы моего массива? Кажется, что пропускают некоторые. Когда я печатаю arraylist в конце, он должен быть пустым, но он печатает его с некоторыми элементами, все еще находящимися там.Arraylist Убрать() не работает

Edit (больше кода):

public static void main(String [] args){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter some a list of words:"); 
    String line = scan.nextLine(); 
    String[] words = line.split(" +"); 
    ArrayList<String> list = new ArrayList<String>(); 
    for(int i=0; i<words.length; i++){ 
     list.add(words[i]); 
    } 

    System.out.println("Remove words less than how many characters?"); 
    int a = scan.nextInt(); 

    remove(list,a); 
    System.out.println(list); 
} 
+2

Что такое параметр 'a' в этом методе? Также отправьте код, который вы используете, чтобы проверить этот метод и распечатать результаты. – FrobberOfBits

+0

Поскольку мне нужно удалить только определенные элементы, я избавился от остальной части кода, чтобы избежать путаницы. – user3166873

+0

На самом деле, remove() работает по назначению. Метод удаления всех элементов не работает должным образом. – Compass

ответ

7

При удалении i-й элемент, то i+1 й элемент становится i й элемент. И так как вы увеличиваете i на каждой итерации, вы пропускаете половину элементов в списке.

Этот цикл будет удалить все элементы:

for(int i = 0; i < list.size();) { 
    list.remove(i); 
} 

Javadoc:

общественных Е удалить (INT индекс)

Удаляет элемент в указанной позиции в этом списке. Сдвигает любые последующие элементы влево (вычитает один из их индексов).

Теперь, если вы хотите перебрать все элементы списка, удаляя лишь некоторые из них, вы можете сделать следующее:

for(int i = 0; i < list.size(); i++) { 
    if (someCondition) { 
     list.remove(i); 
     i--; 
    } 
} 

Это убедитесь, что вы не пропустите какой-либо элемент.

2

Когда вы удаляете i-й элемент, все остальные элементы сдвигаются вниз. Затем вы увеличиваете i в любом случае, что пропускает второй элемент, который был первоначально на i == 1.

Чтобы избежать этого, вы можете удалить элементы в обратном порядке. Вы также можете позвонить по номеру clear() по номеру ArrayList.

+0

@Downvoter Пожалуйста, объясните, как вы думаете, что этот пост можно улучшить. – rgettman

+0

+1, судя по комментариям OP, итерация назад - это то, что они ищут. –

1

Представьте, что у вас есть 10 предметов.

Первая итерация

list.remove(0); The element at the beginning gets removed 

Вторая итерация

list.remove(1); What is now the second element gets removed. But the element who is in position 0 is not removed! 

Третья итерация

list.remove(2); What is now the third element gets removed. But the elements now in position 0 and 1 are not changed! 

Пользователь removeAll или, если вы хотите перебрать, всегда делать remove(0)

-1

Почему это не удаляет каждый элемент в моем массиве?

После удаления каждого элемента ArrayList других элементов после того, как сдвигаются влево так и для элементов, как

a,b,c,d 

удаления (0) будет производить

b,c,d 

Теперь, когда вы звоните удалить (1) это удаляет элемент в положении 1, который составляет

b,c,d 
    ^-this one 

так что вы в конечном итоге с

b,d 

Теперь size() этого списка равно 2, индекс был увеличен до 2 так что ваш цикл заканчивается, потому что i < list.size() состояние уже не так.


Когда я распечатать ArrayList в конце концов, это должно быть пустым, но он печатает его с некоторыми элементами еще там.

Если вы хотите удалить все элементы в списке, просто используйте метод yourList.clear().
Если вы хотите удалить их вручную, всегда используйте remove(0) в каждой итерации вперед и измените свое состояние на yourList.size()>0, но это будет очень неэффективным способом из-за смещения.

+1

@downvoter вы можете объяснить, что именно не так с этим ответом? Я не говорю, что вы не правы, мне просто интересно, что я сделал неправильно (я люблю учиться на ошибках). – Pshemo

1

В принципе, между каждым удалением остальные элементы получают новые позиции или новые индексы.

На практике, вы действительно должны использовать

list.clear() 

для этого конкретного использования.