Удалить элементы из 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;
}
}