我有一个String ArraList
从DB填写。
还有Object ArrayList
,每个对象包含一些String
。
现在我想将String ArrayList
与Object ArrayList
中每个对象的一个字符串进行比较。
如果它等于Object ArrayList
中的对象必须删除。
这是我的Method
代码:
public ArrayList checkMatches(ArrayList<IceCream> iceCreams, ArrayList<String> blackListPartCodes) { // output is filtered Object ArrayList and two Input,
//one is the Object ArrayList and other is String ArrayList
int i, j;
for(i = 0; i<iceCreams.size(); i++) { // Object ArrayList
IceCream iceCream = iceCreams.get(i);
for(j = 0; j<blackListPartCodes.size(); j++) { //String ArrayList
if ((iceCream.getPartCode().matches(blackListPartCodes.get(j)) || iceCream.getPartCode().equals(blackListPartCodes.get(j)))) {
iceCreams.remove(iceCream);
}
}
}
return iceCreams;
}
好的,当我使用这个方法时,它会从我的Object中删除一些对象并减少ArrayList的长度,但是无法正常工作。 我做错了什么?
我在我的应用中使用此代码来查看方法是否正常工作:
Toast.makeText(getApplicationContext(), "Before : " + iceCreams.size(), Toast.LENGTH_LONG).show(); //324
checkMatches(iceCreams, blackListPartCodes);
Toast.makeText(getApplicationContext(), "After : " + iceCreams.size(), Toast.LENGTH_LONG).show(); //200
lenght
的第一个iceCreams
为324,当方法互动时,lenght
为200。
我从DB读取String ArrayList(blackListPartCodes),当我使用select Count(myField) from MyTable
时,它说它有215行。
这意味着如果它正常工作应该是324-215即109。
从另一侧,我在ListView
中显示每个对象的一个字符串。
通过这个:
for(int i = 0; i<iceCreams.size(); i++) { // the filtered iceCreams after calling `checkMatches`method.
typeArray.add(iceCreams.get(i).getPartName()); // String ArrayList
typeAdapter.getItemViewType(R.id.listView); //Adapter of the Array
iceCreamTypeList.setAdapter(typeAdapter); //Adapter set to ListView
}
但是在视野中blackListPartCodes
中的字段仍然存在。
答案 0 :(得分:0)
我试图简化你的方法。 它现在迭代抛出你的数组并将匹配放在一个新的数组列表中。哪个不接触或更改现有阵列:
public ArrayList checkMatches(ArrayList<IceCream> iceCreams, ArrayList<String> blackListPartCodes) {
ArrayList<IceCream> matches = new ArrayList();
for (IceCream iceCream : iceCreams) {
for (String blackListPartCode : blackListPartCodes) {
if (blackListPartCode.equals(iceCream.getPartCode())
|| blackListPartCode.matches(iceCream.getPartCode())) {
matches.add(iceCream);
}
}
}
return matches;
}
答案 1 :(得分:0)
如果i == 0且找到匹配项,则会删除iceCream中索引为0的项目。列表中的所有其他项目将索引减少一个。 因此,在此示例中,不会检查最初具有索引1的项目,因为其新索引为0且i == 1.
相反,跟踪匹配项并在遍历列表后删除它们。
答案 2 :(得分:0)
比较同类对象的简单解决方案,请按照以下步骤操作:
1. Open your IceCream.java file.
2. Add following lines of code :
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (getClass() != o.getClass()) {
return false;
}
final IceCream other = (IceCream) o;
return this.name == other.name;
}
3. Now compare your IceCream class object with another IceCream class object using equals(obj) method.
希望!有用。 :d
答案 3 :(得分:0)
I Finally find out what the problem is. I should identify the iceCream object in inner loop. In this way :
for(i = 0; i<iceCreams.size(); i++) {
for(j = 0; j<blackListPartCodes.size(); j++) {
IceCream iceCream = iceCreams.get(i);
And not this way :
for(i = 0; i<iceCreams.size(); i++) { // Object ArrayList
IceCream iceCream = iceCreams.get(i);
for(j = 0; j<blackListPartCodes.size(); j++) {