我正在寻找一些优化的解决方案,因为我找不到,我有两个自定义对象的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。
有没有更简单的方法或干净的方法来做到这一点。谢谢你的帮助
答案 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);
}
}
}