如何删除数组列表中的对象

时间:2017-02-22 00:23:01

标签: java object

我已经搜索了很多,并检查了作为可能答案提供的帖子,似乎没有人给我答案。

我有这个arraylist,我存储在线用户。 我可以从用户列表中读取并添加到它。 问题是,我似乎无法找到我如何删除它。

我试过了

online.remove("MyUsername");

我的课程和初始化程序是这样的:

 ArrayList<userOnline> online = new ArrayList<userOnline>();

   class userOnline {
        String userName;
        String data1;
        String data2;
        String data3;
    }

我认为它会找到带有用户名的对象行并删除该行,或至少删除用户名,但它没有删除任何内容并且没有给我任何错误。

我能做些什么才能让它发挥作用?或者,如果不可能,我可以使用什么作为替代方案?指向文档解释的指针将是足够的帮助!

谢谢!

似乎解决方案是这样的,但这不被认为是好的做法

for (int i=0; i <online.size(); i++) {
    if(online.get(i).userName.equals("username")) {
        online.remove(i);
    }
}

经过讨论和大量反馈似乎是java处理此搜索和删除的唯一正确方法,

  Iterator<userOnline> it = online.iterator();
      while (it.hasNext()) {
          userOnline user = it.next();
          if (currentLogin.equals(user.userName)) {
              it.remove();
          }
     }

6 个答案:

答案 0 :(得分:5)

我找不到傻瓜或合适的文件,所以这就是:

使用Iterator

for (Iterator<userOnline> iterator = online.iterator(); iterator.hasNext();) {
    if (iterator.next().getName().equals("MyUsername")) {
        iterator.remove();
    }
}

答案 1 :(得分:2)

您可以创建一个函数,该函数接收用户列表并查找给定名称的第一个出现,并在找到具有如此名称的用户时将其删除

public Array<userOnline> removeUserByName(Array<userOnline> users, String nameToFind)
{
    for(int i = 0; i < users.size(); i++)
    {
        if(users.get(i).userName.equals(nameToFind))
        {
            users.remove(i);
            return users;
        }
    }
    return users;
}

您还可以将此函数作为存储userOnline对象列表的类的一部分,然后您就不必将该数组传递给函数。

答案 2 :(得分:2)

遍历列表以查找您感兴趣的元素的索引:

 int idx = -1;
    for (int i = 0; i < online.size(); i++) {
        if(online.get(i).userName.equals("MyUsername"))
        {
            idx = i;
        }
    }

使用此索引删除相关元素:

if(idx != -1) {
    online.remove(online[idx]);
}

这只会删除第一次出现。您可以将此代码放入函数中并重复调用以查找所有实例。

答案 3 :(得分:2)

您必须搜索ArrayList中包含的userOnline对象,并查找匹配的索引或匹配的引用。一旦拥有其中任何一个,就可以使用重载的remove()方法之一从列表中删除该对象。请记住,默认情况下,equals方法会比较引用。

搜索结果如下:

private userOnline findUserOnlineWithUsername(String username) {
    Iterator<userOnline> it = online.iterator();
    onlineUser olu = null;

    while(it.hasNext()) {
        olu = it.next();
        if (olu.userName.equals(username)) { return olu;}
    }

    return null;
}

答案 4 :(得分:2)

基本上,您无法直接比较苹果和梨(StringuserOnline)。是的,您可以覆盖equals,但它应该与所有属性匹配,而不仅仅是一个。

一个简单的解决方案是搜索List,将每个对象userName属性与您希望返回index或对象引用的值进行比较,您可以使用它来删除它

或者,您可以使用Iterator并在搜索时将其删除...

ArrayList<userOnline> online = new ArrayList<>();
userOnline newUser = new userOnline();
newUser.userName = "MyUsername";
online.add(newUser);
System.out.println(online.size());
Iterator<userOnline> it = online.iterator();
while (it.hasNext()) {
    userOnline user = it.next();
    if ("MyUsername".equals(user.userName)) {
        it.remove();
    }
}
System.out.println(online.size());

可能还有一个非常酷的&#34;流&#34;基于解决方案,但步骤很小;)

答案 5 :(得分:0)

您的代码要求从UserOnlines列表中删除String,您需要使用remove(Object o)方法的对象引用,或者您需要查找要删除和使用的对象的索引remove(int index)方法。如何将对象添加到列表中?如果您使用列表本身作为参考,则需要创建自己的方法来定义“MyUserName”应该是什么对象。