比较Object ArrayList和String ArrayList

时间:2016-04-12 12:30:26

标签: java android arraylist

我有一个String ArraList从DB填写。 还有Object ArrayList,每个对象包含一些String。 现在我想将String ArrayListObject 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中的字段仍然存在。

4 个答案:

答案 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++) {