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