2012-02-16 2 views
4

나는 arraylist에 1000 개의 요소를 추가 한 다음 목록에서 체계적으로 인덱스를 지정하여 제거합니다. 이 배후의 아이디어는 LinkedList의 성능을 ArrayList와 비교하는 것입니다.루핑을 통해 arraylist 및 지정된 인덱스에서 요소 제거

int totalObjects = 0; 
    for(int i = 0; i < 1000; i++) 
    { 
     totalObjects += 1; 
     al.add("Object " + totalObjects); 

    } 
    System.out.println("The Arraylist size is " + al.size()); 

내가 다음과 같이하면 요소의 절반 만 제거됩니다. 왜 그럴까요?

for(int index = 0; index < al.size(); index++) 
    { 

     al.remove(index); 

    } 
    System.out.println("The Arraylist size after removal is " + al.size()); 

종류 아리안

답변

11

을 제거하여 색인. 요소 0을 제거하면 요소 1은 이제 요소 0이됩니다. 이제 다음 요소 1을 제거하면 요소 2였던 요소와 요소 1이 색인 0에 계속 존재합니다.

가장 쉬운 방법은 다음과 같습니다. 처음부터 끝까지 거꾸로 되돌릴 수 있습니다.

또는 ArrayList가 비어있을 때까지 인덱스 0을 계속 제거 할 수 있습니다.

+0

감사합니다 ... – Arianule

8

당신이 단순히 clear() 방법을 사용하여 한 번에 모든 요소를 ​​제거 할 수 있음을 유의 간주한다. 귀하의 코드에서 문제는 목록을 수정하는 동시에 해당 목록을 수정하면서 효과적으로 크기를 줄이므로 index < al.size() 조건이 실패합니다. 대신이 시도 :

for (int index = 0, n = al.size(); index < n; index++) 
    al.remove(0); 

또한,이 솔루션은, 끝에서 요소를 제거하고 그 (이 주변 요소를 복사하기 위해 더 이상 필요 없습니다)보다 효율적인 : 당신을 변경하기 때문에이 문제가 발생

for (int idx = al.size() - 1; idx >= 0; idx--) 
    al.remove(idx); 
+0

에서 반복하는 더 좋을 수도 인덱스 0이 될 것입니다 – f2lollpll

2

ArrayList에서 요소를 제거하는 동안 색인이 업데이트되고 있기 때문에. 따라서 위치 0의 요소를 제거하고 위치 1의 요소는 색인 0 위치에있게됩니다. 따라서 색인 1의 요소를 삭제할 때 원래의 색인 2에서 요소를 제거합니다. ArrayList 등등.

1

항목을 제거 할 때 계약서 목록을 제거하십시오.

, 당신의 지수는 현재 1의 당신이 항목을 0 1 2

귀하의 지수가 0

당신이 0 제거 있다고 가정 해 봅시다, 당신은 1

차종 인덱스에 지금의 두 원인을 제거 감각 ?

+0

예, 지금은 의미가 있습니다 ... 감사합니다 – Arianule

1

목록에서 요소를 제거 할 때 목록의 크기가 감소하지만 색인이 증가하기 때문에 목록의 절반 만 비어있는 것이 정상입니다. 그리고 그들은 중간에 만난다. 하나씩 요소를 하나씩 제거하고 마지막 요소에서 첫 번째 요소까지 제거하려는 경우 다음과 같이 사용하는 것이 좋습니다.

while (!al.isEmpty()) 
{ 

    al.remove(al.indexOf(al.size()-1)); 

} 
2

다시 요소를 제거하는 위치를 반복합니다. 제거 할 때마다 요소가 증가 할 때마다 al.size()가 반환하는 값이 감소합니다. 즉, 원하는 시간의 절반 만 반복 할 수 있습니다.

해결 방법은 다음과 같습니다.

int size = al.size(); 
for(int index = 0; index < size; index++) { 

이 방법은 크기가 변하지 않습니다.

기억해야 할 다른 것은 당신이 인덱스 0에있는 ArrayList의에서 무언가를 제거 할 때, 인덱스 1은 그래서 그 요점 나는 확실하지 않다

int index = al.size(); index >=0 ; index-- 
+0

'int index = al.size()'는 ArrayList에서 유효한 인덱스가 아니며, 올바른 표현식은'int index = al.size() -1' –

+0

사실, 그것은 하나의 요점을 전달하는 것이 었습니다. 코드 복사 및 붙여 넣기 금지 – rayred

관련 문제