2016-09-20 7 views
-3

У меня есть два ArrayList с таким же классом модели (например, ListA и ListB), к которым я добавил те же данные. Затем я добавил некоторые данные только во втором arraylist ListB.Если условие внутри вложенного цикла в андроид

Теперь я хочу получить только те данные, которые отличаются как в ListA, так и в ListB и сохраняют результат в третьем arraylist ListC.

Я пробовал под кодом. Тем не менее, все элементы хранятся в ListC, в отличие от только те, которые отличаются:

ArrayList<C> ListC = new ArrayList<>(); 

for (int i = 0; i < ListA.size(); i++) { 

    for (int j = 0; j < ListB.size(); j++) { 

     if (ListA.get(i).getName() == ListB.get(j).getName()) { 

      Log.e("Do", "Nothing"); 

     } else { 
      C c = new C(b.get(j).getName()); 
      ListC.add(c); 
     } 
    } 
} 

Отредактировано Вопрос

ArrayList<Model> a = new ArrayList<>(); 
Model model = new Model(); 
model.setName("MaHi"); 
model.setAge("20"); 
a.add(model); 

ArrayList<Model> b = new ArrayList<>(); 
Model model = new Model(); 
model.setName("MaHi"); 
model.setAge("20"); 
b.add(model); 
Model model2 = new Model(); 
model2.setName("Ritu"); 
model2.setAge("21"); 
b.add(model2); 

ArrayList<Model> c=new ArrayList<>(); 

теперь я хочу получать эти данные, которые не в любом arraylist a или arraylist b (т.е. данные модели2) в arraylist c;

+2

Какой результат * у * вы получаете, и что вы * * ожидать? read read [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и [Как задать хороший вопрос?] (http://stackoverflow.com/help/ как к спрашивать). Затем обновите и * улучшите свой вопрос *. Кроме того, ваша проблема не связана с Android, вы должны удалить этот тег. –

+0

Я просто хочу, чтобы это имя не было одинаковым как в ArrayList -A, B. Но я получил все имена – Mahesh

+0

Непонятно, что вы спрашиваете. Пожалуйста, измените вопрос, чтобы указать, почему код неправильный. – Celeritas

ответ

1

Как у вас есть другая модель класса (A, B) для всего списка, contains и remove методы могут быть вам не полезны, поэтому вы можете использовать флаг contained следующим образом:

Этот флаг указывает для каждого элемента в ListB, если он содержится хотя бы один раз в ListA. Это гарантирует, что каждый элемент в ListB будет добавлен не более. Однажды ваша петля может добавить каждый элемент несколько раз.

+0

Я чувствовал себя свободно, чтобы добавить некоторые объяснения, как работает код. Иллюстрация * почему * исходные коды не работают в [мой ответ] (http://stackoverflow.com/a/39589910/1314743). –

-1

Try ниже код

Arraylist<C> ListC = new ArrayList<>(); 

for (int i = 0; i < ListA.size(); i++) { 

    for (int j = 0; j < ListB.size(); j++) { 

     if (ListA.get(i).getName().equals(ListB.get(j).getName())) { 

      Log.e("Do", "Nothing"); 

     } else { 
      C c = new C(); 
      c.setName(b.get(j).getName()); 
      ListC.add(c); 
    } 
} 
} 

Просто дайте мне знать, если это не помогает решить потребность

я, безусловно, поможет вам

+0

, вы только что изменили '==' на 'equals'. – Mahesh

+0

ну и что? вы были неправы там, поэтому я сделал это. это вовсе не означает проголосовать. смешно –

+0

я не давал вам проголосовать – Mahesh

5

Проблема в том, что вы повторяете все комбинации .

Скажем, A = [1, 2, 3] и B = [1, 3, 4]. Затем ваш цикл будет сравнить

  • a=1 с b=1. Оба равны, ничего не сделано. Это хорошо.
  • a=1 с b=3. Они не равны, поэтому 3 добавляется к C. Вот ваша первая проблема: 3 действительно находится в A, но просто не в вашей текущей итерации.
  • a=1 с b=4. Они не равны, поэтому 4 добавляется к C. В этом случае это нормально, поскольку 4 не находится в A.
  • a=2 с b=1. Они не равны, поэтому 1 добавляется к C. Однако 1 фактически находится в A.
  • и так далее

Вы видите, как ваше решение не работает? Вы не можете сравнить каждую комбинацию. Вместо этого вы должны проверить каждый элемент в B, если он находится в A. Если нет, добавьте. Это непосредственно переводится на псевдокоде выглядит

// for every element in ListB 
for (int i = 0; i < ListB.length(); i++) { 
    B b = ListB.get(i); 
    // if this is not in ListA 
    if (!ListA.contains(b)) 
     ListC.add(b); 
} 

Однако здесь следует использовать для каждого цикла-for (B b: ListB). И еще лучше, просто используйте ListC.addAll(ListB); ListB.removeAll(ListA). (И убедитесь, что hashCode и equals правильно написано. - но это другой вопрос)

Конечно, это требует, чтобы элементы в ListA и ListB одного и того же типа. См. Jekin's answer для решения с использованием менее стандартных библиотечных методов, которые также работают с различными типами (при условии, что оба реализуют getName(), конечно).

Это также устраняет вторую проблему, как указано в комментариях к вашему вопросу: вы не можете сравнивать строки с ==, но должны использовать метод equals. Попробуйте x = new String("a"); y = new String("a"); assert(x==y); и assert(x.equals(y));

0

Проблема здесь в коде

if (ListA.get(i).getName() == ListB.get(j).getName()) { 

    Log.e("Do", "Nothing"); 

} else { 
    C c = new C(); 
    c.setName(b.get(j).getName()); 
    ListC.add(c); 
} 

Вы используете == оператор для сравнения значений String. Который используется для сравнения ссылок, а не сравнения значений. Хотя это может привести к точным результатам на многих языках программирования, но Java обрабатывает сравнение значений по-разному. Вам необходимо использовать метод equals() или equalsIgnoreCase вместо ==.

Так измените строку

if (ListA.get(i).getName().equals(ListB.get(j).getName())) 

Примечание:== оператор может иногда производить правильные результаты, но только потому, что ссылки различных String S'разделяют тот же объект не потому, что они имеют такое же значение, ,

-2
public static void main(String arg[]) 
{ 
    ArrayList<String> a=new ArrayList<>(); 
    a.add("hello"); 
    a.add("hi"); 
    a.add("stack"); 
    a.add("overflow"); 
    a.add("empty"); 
    a.add("world1"); 
    ArrayList<String> b=new ArrayList<>(); 
    b.add("hello"); 
    b.add("hi"); 
    b.add("stack"); 
    b.add("overflow"); 
    b.add("empty"); 
    b.add("world"); 
    ArrayList<String> c=new ArrayList<>(); 
    int flag=0; 
    System.out.println(a.contains("empty")); 
    for (int i = 0; i < a.size(); i++) { 

     if(b.contains(a.get(i))) 
     { 

     } 
     else 
     { 
      System.out.println("haii"); 
      c.add(a.get(i)); 
     } 

    } 
    System.out.println(c.toString()); 
} 

вы попробуете этот пример

+0

, но оба arraylist должны быть такими же .. или иначе это не сработает ... – venkey

Смежные вопросы