【问题标题】:Remove a person from arrayList of person从人员的arrayList 中删除一个人
【发布时间】:2014-10-11 00:14:09
【问题描述】:

我的应用中包含 Google plus。我正在尝试将我的应用分享给 ListView 中显示的朋友列表中的特定人员。

在列表视图中选择人员时,我将他们添加到收件人数组列表中。

如下:

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

我还有一个按钮,可以打开共享活动并使用收件人数组列表来获取要共享的人员 ID、姓名。这部分工作正常。

现在我想从收件人数组列表中删除一个特定的人。这也是在单击项目时完成的。

我尝试了以下方法:

 recipients.remove(person_ID);

这样我无法从 arraylist 中删除该项目。如何从 recipeints arraylist 中删除人员详细信息?

【问题讨论】:

  • person_ID 是唯一的吗?还是有些重复?

标签: java android collections arraylist google-plus


【解决方案1】:

显然,您必须删除 Person 类的对象。

试试这个:

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

或者您可以遍历列表中的所有人,比较 ID 并删除具有匹配 ID 的元素。

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

【讨论】:

  • 你能把你的代码贴在这一行附近吗:com.ylg.me.Friends$2.onItemClick(Friends.java:224)?这只是一个 NPE
  • @Ridcully - 迭代器运行良好。我不太担心没有迭代器的代码。非常感谢!
  • 很高兴我能帮上忙。请注意,Iterator 用于在迭代其元素时能够从列表中删除元素。如果你用 for() 循环尝试这个,你会得到一个异常。此外,由于 person_ID 是唯一的,您可以在 it.remove() 语句之后添加 break
  • 没有得到for循环部分?你能解释一下我什么时候会得到例外吗?
  • 如果你想做这样的事情:for (Person p : recipients) { if (p.getId() == person_ID) { recipients.remove(p); }} 你会得到一个例外。因此使用了迭代器。
【解决方案2】:

由于您的person_ID 是唯一的,您可以使用 Map 接口代替,您可以使用 person_ID 作为 key 并且 value 是 @987654323 的对象@

样本:

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);

为什么要使用 Map 的原因是它有O(1) big-O 的速度

【讨论】:

    【解决方案3】:

    我会使用一个额外的 Map 来存储他们的 ID 引用的 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);
    

    当然,现在有 2 个变量要处理,这可能看起来过于复杂。所以还有 2 种解决方案可以只使用一个变量:

    • 您可以在您的数组列表中浏览以查找具有 personID 的人,然后将其删除
    • 您可以用 HashMap 替换您的数组列表,这取决于您对它的使用情况。

    所以有 3 种解决方案适合您。选择正确的方法取决于您和您的问题中未说明的实施细节。

    (编辑:最后两个解决方案都是@rod 和@Ridcully 给出的解决方案)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2014-05-04
      相关资源
      最近更新 更多