Удалить человека из списка

80
8

У меня есть Google плюс, включенный в мое приложение. Я пытаюсь поделиться своим приложением с конкретным человеком из списка друзей, которые показаны в ListView.

Выбрав человека в списке, я добавляю его в получателя.

как показано ниже:

 private ArrayList<Person> recipients;
recipients= new ArrayList<Person>();
recipients.add(PlusShare.createPerson(person_ID, person_DISPLAY_NAME));

У меня также есть кнопка, которая открывает активность с акциями и использует получателей arraylist, чтобы получить идентификатор пользователя, имя для совместного использования. Эта часть работает нормально.

Теперь я хотел бы удалить конкретного человека из списка массивов получателей. Это также делается при нажатии на элемент.

Я попробовал следующее:

 recipients.remove(person_ID);

Таким образом, я не могу удалить элемент из arraylist. Как удалить информацию о лицах из recipeints arraylist?

спросил(а) 2020-04-04T00:24:39+03:00 5 месяцев, 4 недели назад
1
Решение
70

Очевидно, вы должны удалить объект класса Person.

Попробуй это:

recipients.remove(PlusShare.createPerson(person_ID, person_DISPLAY_NAME));

Или вы можете перебирать всех людей в своем списке, сравнивать идентификаторы и удалять элемент с соответствующим ID.

for (Iterator<Person> it = recipients.iterator(); it.hasNext();) {
Person p = it.next();
if (p.getId() == person_ID) { // <-- supposed that getId() exists
it.remove();
}
}

ответил(а) 2020-04-04T00:37:23.599262+03:00 5 месяцев, 4 недели назад
42

Я бы использовал дополнительную карту для хранения объектов Person, на которые ссылаются их идентификаторы. Таким образом, вы можете получить правильный объект для удаления в список.

private ArrayList<Person> recipients;
recipients= new ArrayList<Person>();
private Map<String,Person> recipientsById = new HashMap<String,Person>;
Person newPerson = PlusShare.createPerson(person_ID, person_DISPLAY_NAME);
recipients.add(newPerson);
recipientsById.put(personId,newPerson);

Таким образом, удаление объекта из списка просто станет:

recipients.remove(recipientsById.get(person_ID));
recipientsById.remove(person_ID);

Конечно, теперь есть две переменные, и это может выглядеть сложнее для этого. Таким образом, есть еще два решения для использования только одной переменной:

    Вы можете просматривать в своем arraylist, чтобы искать человека, имеющего идентификатор personID, и удалить этот Вы можете заменить свой arraylist на HashMap, который может работать в зависимости от того, какое использование вы используете.

Итак, для вас есть 3 решения. Выбор правильного зависит от вас и деталей реализации, которые не указаны в вашем вопросе.

(Изменение: Оба последних решения - это те, которые заданы @rod и @Ridcully)

ответил(а) 2020-04-04T00:24:39+03:00 5 месяцев, 4 недели назад
40

Поскольку ваш person_ID уникален, вы можете использовать интерфейс Map вместо этого, вы можете использовать person_ID в качестве ключа, а значение - это объект Person

образец:

Map<Integer, Person> map = new HashMap<>();

поместить объект в карту


map.put(person_ID, PlusShare.createPerson(person_ID, person_DISPLAY_NAME));

получить/удалить карту

if(map.get(person_ID) != null)
map.remove(person_ID);

По какой причине использование карты заключается в том, что она имеет скорость O(1) big-O

ответил(а) 2020-04-04T00:24:39+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема