来自一个Arraylist的Check对象存在于另一个ArrayList中

时间:2015-01-14 17:25:56

标签: java arraylist

我正在寻找一些优化的解决方案,因为我找不到,我有两个自定义对象的ArrayList。我想检查一个arrayList的特定值是否存在于另一个arrayList中。

这是我的代码

protected void updateDb(HashSet<allDataProperty> set){

    if(set != null)
    list = new ArrayList<allDataProperty>(set);

    nt = ny.getAllData();
    if(nt.size() > 0) {
        for (allData e1 : nt) {
            for (allData e2 : list) {
                if (e1.type.equals("Student") && e2.type.equals("Student")) {
                    if (!(e1.section.equals(e2.section))) {
                        Log.d(TAG, "Not FOUND" + e1.section + "dddd" + e2.section);
                    }
                } else if (e1.type.equals("Emp") && e2.type.equals("Emp")) {
                    if (!(e1.cat == (e2.cat))) {
                        Log.d(TAG, "FOUND Not" + e1.cat + "Category" + e2.cat);
                    }
                } else if (e1.type.equals("Other") && e2.type.equals("Other")) {
                    if (!(e1.cls.equals(e2.cls))) {
                        Log.d(TAG, "FOUND Not");
                    }
                } else if (e1.type.equals("OutSider") && e2.type.equals("OutSider")) {
                    if (!(e1.ran_code == (e2.ran_code))) {
                        Log.d(TAG, "FOUND Not " + e1.ran_code + "Generated" + e2.ran_code);
                    }
                }
            }
        }
    }
  }

因此,我的想法是根据我在上面的代码中所做的一些特定条件,查找从DatabaseList返回的列表中是否存在ArrayList列表中的任何值,该列表是ArrayList nt。

有没有更简单的方法或干净的方法来做到这一点。谢谢你的帮助

3 个答案:

答案 0 :(得分:0)

你可以这样做。

for(CustomObject a:listA){
    if(listB.contains(a)){
         Log.i("Activity","Found");
    }
}

答案 1 :(得分:0)

快速比较各种类型会让它飞得更快。将类型存储在变量中会使其飞得更快。我会在数据库中的更高级别执行此操作。

if(nt.size() > 0) {
    for (allData e1 : nt) {
                string mType1 = e1.type;
        for (allData e2 : list) {
                string mType2 = e2.type
            //quick compare equal
            if (mType1 == mType2) {
                if (mType1.equals("Student")) {
                    if (!(e1.section.equals(e2.section))) {
                        Log.d(TAG, "Not FOUND" + e1.section + "dddd" + e2.section);
                    }
                } else if (mType1.equals("Emp") {
                    if (!(e1.cat == (e2.cat))) {
                        Log.d(TAG, "FOUND Not" + e1.cat + "Category" + e2.cat);
                    }
                } else if (mType1.equals("Other") {
                    if (!(e1.cls.equals(e2.cls))) {
                        Log.d(TAG, "FOUND Not");
                    }
                } else if (mType1.equals("OutSider") {
                    if (!(e1.ran_code == (e2.ran_code))) {
                        Log.d(TAG, "FOUND Not " + e1.ran_code + "Generated" + e2.ran_code);
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

由于您已将集合作为HashSet传递,因此可以利用HashSet可以提供的查找优势 - HashSet contains()方法在O(1)或常量时间运行。相比之下,ArrayList contains()方法需要线性时间,或者运行O(n)。据我所知,您可以通过定义allData.equals(allDataProperty a)方法来完成此操作,类似于以下内容:

//in allData class
Boolean equals(allDataProperty a) {
    if (e1.type.equals("Student") && e2.type.equals("Student")) {
         if (e1.section.equals(e2.section)) {
             return true;
         }
    } else if (e1.type.equals("Emp") && e2.type.equals("Emp")) {
         if (e1.cat == (e2.cat)) {
             return true;
         }
    } else if (e1.type.equals("Other") && e2.type.equals("Other")) {
        if (e1.cls.equals(e2.cls)) {
             return true;
        }
    } else if (e1.type.equals("OutSider") && e2.type.equals("OutSider")) {
        if (!(e1.ran_code == (e2.ran_code))) {
            return true;
        }
    } else {
        return false;
    }
}

然后你的updateDb函数看起来像这样:     protected void updateDb(HashSet set){

    if(set != null) {

    for(allData e1 : nt) {
        if(set.contains(e1)) {
            Log.d("FOUND", e1);
        }
    }
}