Удалить элементы из ArrayList с определенным значением

Я создал список объектов и добавил к ним людей:

ArrayList<Person> peeps = new ArrayList<Person>(); 

peeps.add(new Person("112", "John", "Smith"));
peeps.add(new Person("516", "Jane", "Smith"));
peeps.add(new Person("114", "John", "Doe"));

Я пытаюсь выяснить, как удалить человека из списка по идентификационному номеру. Итак, если бы я хотел удалить человека с идентификационным номером 114, но не сейчас, где он упал в списке, как бы я?

Ответы

Ответ 1

Если вы собираетесь использовать ArrayList, единственный путь - пройти весь список, глядя на каждого человека, и, увидев его, его идентификационный номер - 114. Для более крупных наборов данных это не будет эффективным и следует избегать.

Если вы можете изменить структуру данных, то лучше Map (HashMap обычно является хорошим выбором). У вас может быть номер id как "ключ", а затем ассоциировать его с каждым человеком. Позже вы можете запросить ключ по карте. Кон, вы можете иметь только одно значение в качестве ключа, поэтому вы не можете сказать, что и имя, и номер номера номера

Edit:
Более эффективный способ использования ArrayList состоял бы в том, чтобы сортировать его по номеру id. Затем вы можете использовать что-то вроде Collections.binarySearch() для быстрого доступа к элементам по номеру идентификатора. Кон - это то, что дорогое удаление из/вставки в отсортированный массив, так как все, что нужно, нужно перемещать. Поэтому, если вы собираетесь делать относительно немного изменений по сравнению с количеством чтений, это может быть жизнеспособным.

Ответ 2

Использование Java8:

peeps.removeIf(p -> p.getId().equals("112"));

Обратите внимание, что это эквивалентно линейному поиску и займет время O(n). Если эта операция будет повторяться часто, рекомендуется использовать HashMap для ускорения работы до O(1).

В качестве альтернативы использование отсортированного списка также поможет сделать трюк, но требует O(log n) времени.

Ответ 3

Есть много способов решить эту проблему.

  • Моим любимым является CollectionUtils от apache.common.collection4 или его эквивалент Google. а затем выберите то, что вы хотите, используя предикат или в java 8 - выражение лямбда.

    CollectionUtils.select(peeps, new Predicate<Person>() { @Override public boolean evaluate(Person object) { return object.getId().equals("114"); } });

  • используйте старый добрый итератор и зацикливайтесь над ним

    Iterator<Person> iterator = peeps.iterator(); while(iterator.hasNext()) { Person next = iterator.next(); if(next.getId().equals("114")) { iterator.remove(); } }

Ответ 4

iterate в элементах ArrayList и удалите те, которые соответствуют строке, которую вы хотите удалить: Операции Iterator remove безопасны и не создают ConcurrentModificationException

for (Iterator<String> iterator = peeps.iterator(); elementToCheck = iterator.next();) {
    if (elementToCheck.getId().equals("112")) {
        // Remove the current element from the iterator and the list.
        iterator.remove();
    }
}

Ответ 5

Сначала вам нужно иметь рабочий equals в вашем классе Person (что вам нужно). Затем вы можете просто использовать List#indexOf и List#remove. Например:

final Person toRemove = new Person("112");
peeps.remove(peeps.indexOf(toRemove));

(при условии, что идентификатор Person уникален).

Альтернативно, если ваш список ArrayList, вы можете использовать ArrayList#remove(Object):

final Person toRemove = new Person("112");
peeps.remove(toRemove);

Если вы используете Java 8, вы можете использовать решение Paul.

Ответ 6

class Processor{

ArrayList<Person> peeps = new ArrayList<Person>(); 

void setPeeps(){
    peeps.add(new Person(112, "John", "Smith"));
    peeps.add(new Person(516, "Jane", "Smith"));
    peeps.add(new Person(114, "John", "Doe"));
}

void removePerson(int id){
    for(int i=0; i <= peeps.size(); i++){
        Person person = peeps.get(i);
        if(person.id == id)
            peeps.remove(peeps.get(i));
    }
}

void displayPersonsList(){
    for(Person person : peeps){
        System.out.println(person.id + ":" + person.fName + ":" + person.lName);
    }
}

public static void main(String args[]){
    Processor objProcessor = new Processor();
    objProcessor.setPeeps();
    objProcessor.removePerson(114);
    objProcessor.displayPersonsList();
}
}

class Person{
int id;
String fName;
String lName;

public Person(int id, String fName, String lName){
    this.id = id;
    this.fName = fName;
    this.lName = lName;
}
}