2012-04-23 2 views
4

Я хочу удалить элемент из ArrayList, длина которого равна числу, переданному в виде целого числа. Мой код выглядит следующим образом. При запуске программы выдает UnsupportedOperationException в строке, когда используется метод remove(). На самом деле это проблема кодирования.Удаление объекта из ArrayList

public static List<String> wordsWithoutList(String[] words, int len) {  
    List<String> list = new ArrayList<String>(); 

    list = Arrays.asList(words); 

    for(String str : list) { 
     if(str.length() == len) { 
      list.remove(str); 
     } 
    } 
    return l;  
} 
+0

Хорошо, а что ваш вопрос? – simchona

+0

Я хочу знать, почему он выбрасывает вышеизложенное исключение –

+0

вам следует наложить на '(Список ) Arrays.asList (слова);' – aviad

ответ

10

Список возвращаемый asList не является ArrayList - он не поддерживает изменения.

Вам нужно сделать

public static List<String> wordsWithoutList(String[] words, int len) { 

    List<String> l = new ArrayList<String>(Arrays.asList(words)); 

    for(Iterator<String> iter = l.iterator(); iter.hasNext();){ 
     String str = iter.next(); 
     if(str.length()==len){ 
      iter.remove(); 
     } 
    } 
    return l;  
} 

So две вещи:

  • Сделайте изменяемую копию массива, возвращаемого asList с помощью ArrayList конструктора.
  • Используйте итератор remove, чтобы избежать ConcurrentModificationException.

Было отмечено, что это может быть неэффективным, так что лучше альтернатива:

List<String> l = new ArrayList<String>(str.length()); 
            // ^^ initial capacity optional 
for(String str : words) 
    if(str.length()!=len) 
     l.add(str); 

return l; 
+1

Любопытно, что это хорошая практика (изменение списка, на котором вы итерации)? или новый список должен быть создан, где мы должны добавить нужные нам элементы и вернуть новый ArrayList? – zengr

+2

Я думаю, что это чище создавать новый список и добавлять к нему элементы. – SimonC

+0

@zengr Любая стратегия работает с удалением элементов ArrayList из середины перемещает все следующие элементы в списке, поэтому, если есть много элементов для удаления или большой список, лучше использовать стратегию копирования. – trutheality

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