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

편집 : (메멘토 모리의 제공) 코드가 작동하지 않는 이유는 당신이 요소를 제거 할 때의 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

여기서 정말로하고 싶은 것을하지 않습니다. 두 번째 for 루프에서 찾을 수없는 위치 i의 요소 대신 compare 배열에서 해당 값이 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; 
} 

편집 : 코드가 작동하지 않는 이유는 당신이 요소를 제거 할 때의 ArrayList의 위치가 변화하고 있다는 점이다. 이제 요소 3을 제거했다고 가정 해 보겠습니다. 이제 요소 3은 이전과 다릅니다.

+0

이것은 실제로 더 좋은 방법이지만, 코드에서 무엇이 잘못되었는지 결코 알지 못합니다! – cwhsu

+0

그래서 compareHasPrevious() 구문 오류가 발생하고 반복자가 무엇인지 모르기 때문에 사용 방법을 알기 어렵습니다. 어떻게 수정해야하는지 모릅니다. – user2172926

+0

@ user2172926 실행 해 봅시다. 방금 코드를 작성했습니다. 아마 뭔가 엉망이 됐을거야. –