【问题标题】:ArrayList check if data already existsArrayList 检查数据是否已经存在
【发布时间】:2015-07-12 04:57:51
【问题描述】:

只想检查数据是否已经存在于 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 方法比较对象。在这里,您将列表对象与错误的列表项进行比较。您需要遍历列表以检查特定名称是否存在。
  • 条件错误。打印DataArrayList.secondArrayliststrName的值你会发现错误。

标签: java android arraylist


【解决方案1】:

您正在将列表对象 DataArrayList.secondArraylistString 进行比较

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

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

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

【讨论】:

  • 看起来不错,但你能用其他方法给我看一下吗,可能用更简单的方法
  • 我的意思是这样的: for (int i = 0; i
  • 获取:方法 contains(ArrayList, String) 未定义类型 new View.OnClickListener(){}
  • 非常感谢,如果我想删除 ArrayList 中已经存在的项目怎么办,最后使用这个:stackoverflow.com/a/30023021/4675078
  • 这不是 优化 方法来检查对象是否已经存在于数组中。当你已经有 in built function contains 时,为什么要迭代数组?
【解决方案2】:

contains 方法调用带有签名 equals(Object) 的 equals 方法,所以你需要在你的 POJO 类中重写这个方法。

如果你覆盖 equals(Object) 那么你也应该覆盖 hashcode()

代码sn-p:

@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 对象如果它们的名称相同,则它们是相等的。我不认为这是一个安全的假设。
  • 这不是假设。 这就是他所需要的我们可以从toString返回我们想要比较两个对象的值
  • toString() 在哪里出现?它不用于比较。另外,为什么!super.equals(obj);?这将导致 equals 方法与其意图相反。
  • @pathfinderelite 首先,搞清楚contains 方法的概念。你会得到所有答案:)
【解决方案3】:

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

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

【讨论】:

  • ArrayList 包含Second 类型的对象,而不是String。这行不通。
【解决方案4】:

由于您正在检查的strName 是您的对象Second 的一个属性,因此您不能直接使用ArrayList 的方法对其进行检查。最简单的方法是遍历ArrayList DataArrayList.secondArraylist,获取列表中包含的每个Second 对象,然后检查strName 是否等于Second 对象的该属性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2021-11-10
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多