2013-03-15 3 views
0

В этом методе я пытаюсь сравнить все элементы в одном arraylist со всеми элементами в другом. Тогда, если элемент в первом arraylist не равен ни одному элементу во втором arraylist, удалите этот элемент. Что-то не так на этапе сравнения или удалении, но я не уверен, что. Любая помощь будет принята с благодарностью.Сравнение одного arraylist с другим и удаление дополнительных элементов java

Если вы хотите уточнить, не стесняйтесь спрашивать.

public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) { 
    int[] counter = new int[compare.size()]; 

    for (int x: counter) { 
     x = 0; 
    } 
    for (int i = 0; i < compare.size(); i++) { 
     counter[i] = 0; 
     for (int number: array2) { 
      if (compare.get(i) ==number) { 
       counter[i]++; 
      } 

     } 

    } 
    for (int i=0; i<counter.length;i++) { 
     if (counter[i]==0) { 
      compare.remove(new Integer(i)); 
     } 
    } 

    return compare; 
} 

EDIT: (любезно Memento Mori) Причины ваш код не работает в том, что позиции в вашем ArrayList изменяется при удалении элемента. Допустим, вы удалили элемент 3. Теперь элемент 3 отличается от предыдущего.

+0

Я предполагаю, что это какая-то домашняя работа. В противном случае я бы предложил использовать list1.retainAll (list2) - он делает именно то, что вы хотите. –

ответ

0
public class Test { 

    public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) { 
     ArrayList<Integer> a3 = new ArrayList<Integer>();    
     for (Integer a : compare) 
     { 
      if(array2.contains(a)) 
       a3.add(a); 
     } 
      System.out.println(a3); 
     return a3; 
    } 

    public static void main(String[] args) { 
     ArrayList<Integer> a1=new ArrayList<Integer>(); 
     ArrayList<Integer> a2=new ArrayList<Integer>(); 
     a1.add(1); 
     a1.add(5); 
     a1.add(3); 
     a2.add(3); 
     a2.add(4); 
     a2.add(5); 
     a2.add(6); 
     Test test=new Test(); 
     test.compareArrayandList(a1,a2); 

    } 

} 
+0

Это решение работает. Просто хочу указать, что он должен быть возвращен (a3); как последняя строка, так как это был измененный список. Большое спасибо! – user2172926

+0

Да, я просто забыл сделать это – Biswajit

0
ListUtils.sum(Arrays.asList(firstarray),Arrays.asList(secondarray)) 
0

Вы не делаете то, что вы действительно хотите здесь сделать. Вы удаляете элемент (ы), значение которого является i из массива сравнения, а не элемент в позиции i, который не находится во втором цикле.

for (int i=0; i<counter.length;i++) { 
    if (counter[i]==0) { 
     //compare.remove(new Integer(i)); // problem is here! 
     // remove element at index i not element equals to i 
     compare.remove(i); 
    } 
} 
+0

Нет, это намеренно. Я использовал этот обходной путь с помощью счетчика, чтобы попытаться исправить проблему с изменением списка, пока цикл for все еще работает. Но по какой-то причине это не работает. – user2172926

0

Вам не нужен ваш массив счетчиков. Вы можете выполнить сравнение за один шаг, если используете итератор. Я считаю, что это должно работать:

public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) { 
    ListIterator<Integer> iter = compare.listIterator(compare.size()); 
    while (iter.hasPrevious()){ 
     Integer a = new Integer(iter.previous()); 
     for (int number: array2) { 
      if (a==number) iter.remove(); 
     }   
    } 
return compare; 
} 

EDIT: Причина, ваш код не работает в том, что позиции в вашем ArrayList изменяется при удалении элемента. Допустим, вы удалили элемент 3. Теперь элемент 3 отличается от предыдущего.

+0

Это действительно лучший способ, но тогда он никогда не знает, что не так в его коде! – cwhsu

+0

Итак, я получаю синтаксическую ошибку с compare.hasPrevious(), и поскольку я не знаю, что такое итератор, тем более, как использовать его, я понятия не имею, как его исправить. – user2172926

+0

@ user2172926 Позвольте мне попробовать запустить его. Я только что сделал этот код. Я, наверное, что-то испортил. –

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