2012-05-08 2 views
5

У меня есть ArrayList, который содержит некоторый объект, такой как User, и каждый объект имеет name и password. Как я могу удалить только объект User, у которого есть определенное «имя» из этого ArrayList?Как удалить объект из ArrayList в Java?

+3

Можете ли вы более точно описать свой вопрос? напишите фрагмент кода, над которым вы работаете ... – aleroot

ответ

1

Просто выполните поиск через ArrayList объектов, которые вы получаете от пользователя, и проверьте имя, равное имени, которое вы хотите удалить. Затем удалите этот объект из списка.

+0

Надеемся, что могут быть сделаны оптимизации, поскольку в противном случае OP застрял в реализации O (n). –

+1

@ X-Zero В каком сценарии, где вы не знаете, где находится объект в списке, вы могли бы лучше, чем 'O (n)'? –

+2

@ X-Zero: Если все OP имеет список массивов, то «O (n)» - это лучшее, на что он может надеяться (только удаление элемента - «O (n)»). – NPE

2

Вы могли:

  • цикл по списку с итератора
  • проверить, если каждый элемент в списке является правильным пользователем (проверка имени)
  • если используется метод удалить итератора.
21
Iterator<User> it = list.iterator(); 
while (it.hasNext()) { 
    User user = it.next(); 
    if (user.getName().equals("John Doe")) { 
    it.remove(); 
    } 
} 
+9

Не похоже, чтобы OP выполнял какую-либо работу по этому вопросу, вы не должны давать им код бесплатно. –

+0

Что представляет собой список? ????? –

+1

Да Да, я получил это ... спасибо –

0

Ваш код может выглядеть следующим образом:

List<User> users = new ArrayList<User>(); 

public void removeUser(String name){ 
    for(User user:users){ 
     if(user.name.equals(name)){ 
      users.remove(user); 
     } 
    } 
} 
+2

Вы должны использовать итератор для удаления в цикле или, скорее всего, получите исключение ConcurrentModificationException. – assylias

+0

@assylias Базовый цикл был расширен в Java 5, чтобы сделать итерацию по массивам и другим коллекциям более удобной. И для каждой импликации цикла используется итератор –

+1

Попробуйте запустить этот код (извините за форматирование): 'List list = new ArrayList (); list.add ("a"); для (строка s: список) { list.remove (s); } 'и вы должны получить исключение. – assylias

4

Еще одна мысль: Если класс пользователя может быть однозначно определено имя пользователя, и если вы переопределить равно что-то вроде:

общественные булевы равно (arg0 Объект) {

return this.name.equals(((user) arg0).name); 
} 

Вы можете удалить пользователя без повторения в списке. Вы можете просто сделать:

list.remove (новый пользователь ("John Doe"))

5

Вы наверняка сталкивались с ConcurrentModificationException при попытке удалить объект из List. Объяснением для этого исключения является то, что итератор ArrayList является отказоустойчивым итератором. Например, он будет генерировать исключение (fail), когда обнаруживает, что его коллекция во время выполнения была изменена. Решение этой проблемы - использовать Iterator.

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

List<User> list = new ... 

for (Iterator<User> it = list.iterator(); it.hasNext();) { 

    User user = it.next(); 
    if (user.getUserEmail().equals(currentUser.getUserEmail())) { 
     it.remove(); 
    } 
} 
4

Вы могли бы использовать что-то вроде этого:

  arrayList.removeIf(s-> s.getName().contains("yourName")); 
+0

Что такое '' '? Пожалуйста, сделайте свои ответы более конкретными. –

+0

s здесь предикат, и это работает только в JDK 1.8, где поддерживается выражение Lambda. Уничтожает все элементы этой коллекции, которые удовлетворяют заданному предикату. – jprism

2

Рекомендуем способ решения этой проблемы:

ArrayList<User> list = new ArrayList<User>(); 
list.add(new User("user1","password1")); 
list.add(new User("user2","password2")); 
list.add(new User("user3","password3")); 
list.add(new User("user4","password4")); 
Iterator<String> iter = list.iterator(); 
while (iter.hasNext()) 
{ 
    User user = iter.next(); 
    if(user.name.equals("user1")) 
    { 
     //Use iterator to remove this User object. 
     iter.remove(); 
    } 
} 

Использование Iterator для удаления объекта более эффективно, чем удаление, просто набрав ArrayList(Object) , потому что он быстрее и на 20% экономит время и стандартную практику Java для коллекций Java.

-1
ArrayList<User> userList=new ArrayList<>(); 
//load data 

public void removeUser(String userName){ 
    for (User user: userList){ 
     if(user.getName()equals(userName)){ 
      userList.remove(user); 
     } 
    } 
} 
+2

Невозможно удалить при повторном выполнении для каждого http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re – Gangaraju

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