2016-04-12 8 views
0

У меня есть String ArraList, которые заполняются из базы данных. И Object ArrayList, что каждый объект содержит String. Теперь я хочу сравнить String ArrayList с одной из строк каждого объекта в Object ArrayList. Если он равен объекту от Object ArrayList, его необходимо удалить. Вот мой Method Код:Сравнить Object ArrayList со String ArrayList

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

Хорошо, когда я использую этот метод, он удаляет некоторые объекты из моего объекта и уменьшить длину в 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. Я прочитал Струнный ArrayList (blackListPartCodes) из БД, что когда я использую select Count(myField) from MyTable, он говорит, что у него 215 строк. , что означает, что если он правильно работает, будет 324-215, что составляет 109. С другой стороны я показываю одну из строк каждого объекта в ListView. Via это:

 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

', но не работает correctly' то, что вы имеете в виду под этим? –

+0

Позвольте мне угадать: 'ConcurrentModificationException'. Легко искать на SO и в Интернете в целом. Кроме того, в общем случае использование 'remove (Object)' не будет ужасно результативным, так как вам придется перебирать список. Или, если он не удаляет правильный, показывая, что реализация 'equals' может быть полезна. –

+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; 
} 
0

Если я == 0 и он находит совпадение, он удаляет элемент с индексом 0 в МОРОЖЕНОМ. Все остальные элементы в списке уменьшают свой индекс на единицу. Итак, в этом примере элемент, который первоначально имел индекс 1, не будет проверяться, так как его новый индекс равен 0 и i == 1.

Вместо этого отслеживайте соответствующие элементы и удаляйте их после итерации по списку.

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

0

И наконец, выясните, в чем проблема. Я должен идентифицировать объект iceCream во внутреннем цикле. Таким образом:

 for(i = 0; i<iceCreams.size(); i++) { 
     for(j = 0; j<blackListPartCodes.size(); j++) { 
      IceCream iceCream = iceCreams.get(i); 

И не так:

for(i = 0; i<iceCreams.size(); i++) { // Object ArrayList 
     IceCream iceCream = iceCreams.get(i); 
     for(j = 0; j<blackListPartCodes.size(); j++) { 
Смежные вопросы