JAVA 기반 - ArrayList 삭제 문제

2757 단어 작은 지식
며칠 전에 문제가 발생했습니다. 데이터를 필터할 때 Array List의 원소가 어떤 조건에 부합될 때 이 원소를 삭제해야 합니다.
그러나 마지막 결과 검사를 할 때 항상 절반 정도 덜 지워진 것을 발견했다.인터넷에서 찾아보니 그 이유를 알 수 있었다.먼저 다음과 같은 간단한 에뮬레이션 코드를 살펴보십시오.
public class ListRemove {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList arrayList = new ArrayList();
		arrayList.add(1);
		arrayList.add(2);
		arrayList.add(3);
		arrayList.add(5);
		arrayList.add(4);
		arrayList.add(6);
		arrayList.add(9);
		
		ListRemove l = new ListRemove();
		System.out.println("       :");
		l.printArrayList(arrayList);
		//      
//		l.deleteEven(arrayList);
//		System.out.println("           :");
//		l.printArrayList(arrayList);
		//      
		l.removeByIterate(arrayList);
		System.out.println("           :");
		l.printArrayList(arrayList);
	}
	//      
	public void deleteEven(ArrayList a){
		for(int i=0;i a){
		Iterator array = a.iterator(); 
		int i=0;
		while(array.hasNext()){
			if(i>=a.size()){//           
				break;
			}else if(a.get(i)%2==0){
				a.remove(i);
			}
			i++;
		}
	}
	//  arrayList
	public void  printArrayList(ArrayList a){
		for(int i=0;i

실행 후 결과는 다음과 같습니다. 삭제 전 인쇄는 다음과 같습니다. 1,2,3,5,4,6,9 순환 삭제 짝수 후 인쇄는 다음과 같습니다. 1,3,5,6,9 삭제 전 인쇄는 다음과 같습니다. 1,2,3,5,4,6,9 반복 삭제 짝수 후 인쇄는 다음과 같습니다. 1,3,5,6,9
왜 array List에서 6이라는 짝수는 삭제되지 않았습니까?왜냐하면 삭제하는 동시에arrayList의size가 바뀌었고 요소의 하단도 바뀌었기 때문이다.짝수 4를 삭제할 때 다음 순환에서 얻을 요소는 9입니다.6 은 건너뛰었다.사실 건너뛴 것은 6뿐만 아니라 2 뒤에 있는 3도 건너뛰었다.해결 방법은 다음과 같습니다.
//      
	public void deleteEven(ArrayList a){
		for(int i=0;i a){
		Iterator array = a.iterator(); 
		int i=0;
		while(array.hasNext()){
			if(i>=a.size()){//           
				break;
			}else if(a.get(i)%2==0){
				a.remove(i);
				i--;//   ,       
			}
			i++;
		}
	}

또 다른 해결 방법은 거꾸로 순환하는 것이다.수정 코드는 다음과 같습니다.
//        
		public void deleteEven(ArrayList a){
			for(int i=a.size()-1;i>0;i--){
				if(a.get(i)%2==0){
					a.remove(i);
				}
			}
		}

public void removeByIterate(ArrayList a){
		Iterator array = a.iterator(); 
		int i=a.size()-1;
		while(array.hasNext()){
			if(i<0){//           
				break;
			}else if(a.get(i)%2==0){
				a.remove(i);
			}
			i--;
		}
	}

이렇게 하면 모든 요소도 필터링할 수 있습니다.그리고 한마디 더 하자면, 진심으로 이 웹 페이지 텍스트 편집기에 의해 패배했다. 아주 쓰기 불편하다. 아마도 나도 쓸 줄 모를 것이다.어지럽다

좋은 웹페이지 즐겨찾기