Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ArrayList删除对象_Android_Arraylist - Fatal编程技术网

Android ArrayList删除对象

Android ArrayList删除对象,android,arraylist,Android,Arraylist,我正在android studio中开发一个应用程序。应用程序中我遇到的问题是,用户可以在其中收藏和删除他们最喜欢的项目。我通过在列表中添加和删除该项来完成此操作 关键是添加功能的工作原理是: public void addFavorite(Context context, NewSubject subject) { List<NewSubject> favorites = getFavorites(context); if (favorite

我正在android studio中开发一个应用程序。应用程序中我遇到的问题是,用户可以在其中收藏和删除他们最喜欢的项目。我通过在列表中添加和删除该项来完成此操作

关键是添加功能的工作原理是:

   public void addFavorite(Context context, NewSubject subject) {

        List<NewSubject> favorites = getFavorites(context);
        if (favorites == null)
            favorites = new ArrayList<NewSubject>();

        favorites.add(subject);
        saveFavorites(context, favorites);
    }
public void addFavorite(上下文,新闻主题){
列表收藏夹=获取收藏夹(上下文);
如果(收藏夹==null)
收藏夹=新的ArrayList();
收藏夹。添加(主题);
保存收藏夹(上下文、收藏夹);
}
我正在传入一个类型为“NewSubject”的对象,它只是一个名称和id的getter和setter类

当我尝试从此列表中删除某个项目时,问题就出现了。代码如下:

public void removeFavorite(Context context, NewSubject subject) {

    ArrayList<NewSubject> favorites = getFavorites(context);
    if (favorites != null) {
        favorites.remove(subject);
        saveFavorites(context, favorites);
    }
}
public void removeFavorite(上下文,新闻主题){
ArrayList favorites=getFavorites(上下文);
如果(收藏夹!=null){
收藏夹。删除(主题);
保存收藏夹(上下文、收藏夹);
}
}
我甚至试过这样的方法:

  for(int i = 0; i < favorites.size(); i++){
                if(favorites.get(i).getSubject_name() == subject.getSubject_name())
                    favorites.remove(i);
            }
for(int i=0;i
即使两个主题名称都匹配,if语句也不会作为true触发。通过将其更改为ID,它确实删除了该项,但我想知道为什么它不能以另一种方式工作。MeetTitan建议使用“equals”操作符来比较字符串,这已经解决了这个问题。但我仍然想知道为什么在没有FOR循环和IF语句的情况下通过“subject”删除该项不起作用

我在调试问题源时多次清除了应用程序的数据

谢谢你的时间和帮助,非常感谢

试试看

String.equalsIgnoreCase(value1,value2) 

这可能会完成您的工作。

如果您要两次创建NewSubject,则此项适用。。。如果您试图删除与从集合中获得的NewSubject完全相同的实例,那么我猜错了,这不是您想要的答案

您是否可能没有在收藏夹对象中定义equals和hashCode?如果没有这些删除,则只能使用集合中完全相同的对象实例。如果没有,请尝试定义它们,看看remove()是否按预期的方式工作

如果未定义这些方法,集合将以以下方式响应:

Obj x=new Obj("data")
Obj y=new Obj("data")

collection.put(x)
collection.remove(y)

assert( collection.size() == 1) // was not removed because .equals didn't exist--remove reverted to == instead which failed, x != y

collection.remove(x)

assert( collection.size() == 0) // NOW it worked because you used the same instance.
如果定义.equals和hashCode来比较obj中的字符串,那么这将起作用:

collection.put(x)
collection.remove(y)

assert( collection.size() == 0) // worked because x.equals(y)!

从您的示例中可以明显看出,name是一个String对象。在java中,必须使用“.equals()”或比较两个字符串。 您可以这样做:

    if(favorites.get(i).getSubject_name().equals(subject.getSubject_name())){
    ...
}
或者,您可以重写NewSubject类中的equals()方法,以实现此功能:

favorites.remove(subject);
您可以在NewSubject类中使用类似的equals()方法(考虑到您仅根据名称匹配两个NewSubject对象):

更新: 您可能还需要重写hashcode()。如果您的NewSubject类曾经在基于哈希的集合(如HashMap)中使用过,那么仅重写equals()方法是不够的。作为参考,这是Joshua Bloch的《有效Java》中的内容:

必须在每个重写equals()的类中重写hashCode()。 否则将导致违反总合同 对于Object.hashCode(),这将阻止类运行 与所有基于哈希的集合正确结合,包括 HashMap、HashSet和Hashtable


您正在尝试将字符串对象与==进行比较。在Java中不能这样做。你必须做
str1.equals(str2),否则它将检查对象引用是否相同(它们可能不相同),而不是内容。请检查“谢谢”,这解决了字符串问题,但是如果没有for循环和IF语句,而只是尝试通过对象删除项,该怎么办?@Gary override equals和hashcode方法用于类newsubject如果重写
equals(),则应重写
hashcode()
.ArrayList不是基于哈希的集合,它的remove(object)方法不依赖于哈希代码。参考号:。因此,它在这种情况下可以正常工作(已测试)。但是,你是对的。如果对象用于任何基于哈希的集合(如HashMap、HashTable等),则在不重写hashcode()的情况下重写equals()可能会很危险。我的答案会更新。只是因为它编译了,并不意味着它不会错。无论如何,您已经更新了您的答案,享受+1。它不仅可以编译,而且可以与ArrayList完美配合使用,只要您在非基于哈希的集合中使用它,就不会有任何问题。查看ArrayList#remove(object)文档,它不关心哈希代码,它只使用equals()方法。但是我想,我已经同意equals()应该总是和hashcode()一起被覆盖
@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    NewSubject otherSubject = (NewSubject) other;
    if(this.getSubject_name().equals(otherSubject.getSubject_name())) 
      return true;
    else
      return false;
}