ArrayList如何检查数据是否已存在

7

我想检查ArrayList中是否已经存在数据,但每次都得到“不存在”,而实际上数据确实存在于ArrayList中,结果导致列表中出现重复记录。

    DataArrayList.secondArraylist.add(new Second(actorList.get(position).getName(), actorList.get(position).getImage()));
             System.out.println(DataArrayList.secondArraylist.size());   

             String strName = actorList.get(position).getName().toString();
             Log.d("name:", strName);

             for(int i=0; i<DataArrayList.secondArraylist.size(); i++) 
             {

                 if(DataArrayList.secondArraylist.get(i).getName().equals(strName)) {
                     System.out.println(DataArrayList.secondArraylist.get(i).getName());

                     Toast.makeText(context, "Exist(s)", Toast.LENGTH_SHORT);
                }
                 else {

                     Toast.makeText(context, "Not Exist(s)", Toast.LENGTH_SHORT);
                }

             }

问题:

没有收到任何Toast消息,我是用它来指示“数据存在”或“不存在”的

最终结果:

如果列表中不存在该项,则将其添加到ArrayList中,否则显示Toast,提示该项已存在


equals方法与对象比较。在这里,您正在比较列表对象与列表项,这是错误的。您需要遍历列表以检查特定名称是否存在。 - Dhaval Patel
condition 中出现错误。打印 DataArrayList.secondArrayliststrName 的值,您将找到错误。 - user2756345
请访问:https://dev59.com/NmYq5IYBdhLWcg3wzDlI - Haresh Chhelana
4个回答

24

您正在将您的列表对象DataArrayList.secondArraylist与一个String进行比较。

if (DataArrayList.secondArraylist.equals(strName)) {

这将始终返回 false。相反,创建一个方法来循环遍历列表,并检查 strName 是否与存储在列表中的 Second 对象的名称匹配。

boolean contains(ArrayList<Second> list, String name) {
    for (Second item : list) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}

然后使用它

if (contains(DataArrayList.secondArraylist, strName)) {
    System.out.println("Data Exist(s)");
} else {
    System.out.println("Not Exist(s)");
}

看起来不错,但你能用其他方式展示给我吗?也许可以使用更简单的方法。 - Oreo
我的意思是这样的:for (int i = 0; i < DataArrayList.secondArraylist.size() ; i++) { if (i.contains(strName)) { System.out.println("不存在"); } else { System.out.println("数据存在"); } } - Oreo
获取:方法 contains(ArrayList<Second>, String) 在类型 new View.OnClickListener(){} 中未定义。 - Oreo
非常感谢,如果我想要在ArrayList中删除已经存在的项,最后使用这个:http://stackoverflow.com/a/30023021/4675078 - Oreo
这不是检查对象是否已存在于数组中的优化方式。当您已经有内置函数_contains_时,为什么要迭代数组? - SweetWisher ツ
@SweetWisherツ 内置的 contains 方法也会遍历项目 - 它仍然是一个数组,而不是哈希表。 - pathfinderelite

2

contains方法调用具有签名equals(Object)的equals方法,因此您需要在POJO类中覆盖此方法。

如果您重写equals(Object),则还应该重写hashcode()

代码片段:

@Override
public String toString() {
    return getName();
}

 @Override
 public boolean equals(Object obj) {
     return !super.equals(obj);
 }

 @Override
 public int hashCode() {
      return getName().hashCode();
 }

编辑:

此外,contains方法是用于Object对象的。因此,您的条件应该像这样:

 (DataArrayList.secondArraylist.contains(actorList.get(position))) 

最终代码:

if (DataArrayList.secondArraylist.contains(actorList.get(position))) {
    System.out.println("Data Exist(s)");
} else {
    System.out.println("Not Exist(s)");
}

假定如果两个 Second 对象的名称相同,则它们是相等的。我认为这个假设并不安全。 - pathfinderelite
这不是假设。_这是他需要的_,我们可以从toString返回值,以便比较两个对象。 - SweetWisher ツ
toString() 在哪里发挥作用?它不用于比较。另外,为什么要使用 !super.equals(obj);?那会导致 equals 方法与其原意相反。 - pathfinderelite
@pathfinderelite 首先,要清楚_contains_方法的概念。你就会得到所有的答案 :) - SweetWisher ツ

0

在检查ArrayList中的值时,您需要使用indexOf()

if (DataArrayList.secondArraylist.indexOf(strName)!=-1) {
System.out.println("Data Exist(s)");
    } else {
System.out.println("Not Exist(s)");
}

ArrayList 包含的是 Second 类型的对象,而不是 String。这样行不通。 - pathfinderelite

0

由于您要检查的strName是您对象Second的属性,因此您无法直接使用ArrayList的方法进行检查。最简单的方法是循环遍历DataArrayList.secondArraylist中的Second对象列表,然后检查strName是否等于您的Second对象的该属性。

不确定您如何实现Second对象,但您应该从每个Second对象获取相应的字符串,然后将其与strName进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接