2012-11-28 4 views
1

이상한 동작을 보이는 Java 큐가 있습니다. q.size()을 호출하면 After 요소가 대기열에 푸시되고 항목의 첫 번째 절반 만 동일한 대기열에서 튀어 나옵니다. 그러나 q의 항목을 내리기 전에 q.size()에 의해 반환 된 값을 저장하면 모든 항목이 팝됩니다. 왜 그런가요? official documentation는 말한다 :이상한 큐 동작

public int size()

이 목록의 요소의 수를 돌려줍니다.

여기에 제가 사용하는 코드가 있습니다. 필자는 JDK 6.0_31, JDK 7.0_7 및 Eclipse Compiler 0.A48의 세 가지 컴파일러를 사용했습니다. 결과는 같습니다.

import java.util.*; 

public class StrangeQueueTest{ 
    public static void main(String[] args){ 
     Queue<String> q = new LinkedList<String>(); 
     String[] testData = {"1: one", "2: two", "3: three", "4: four", "5: five", 
     "6: six", "7: seven", "8: eight", "9: nine", "10: ten", "11: eleven", 
     "12: twelve", "13: thirteen", "14: fourteen", "15: fifteen", 
     "16: sixteen", "17: seventeen", "18: eighteen", "19: nineteen", 
     "20: twenty"}; 

     //Push items into the queue 
     for(int x = 0; x < testData.length; x++) 
     q.add(testData[x]); 

     //Pop items out of the queue, calling size() at every iteration 
     for(int x = 0; x < q.size(); x++) 
     System.out.println(q.poll()); 

     //Pop items out of the queue, calling size() once 
     /*int count = q.size(); 
     for(int x = 0; x < count; x++) 
     System.out.println(q.poll());*/ 
    } 
} 

size() 방법이 왜 일관되게 작동하지 않습니까? 내가 뭔가 잘못하고 있는거야? 그렇다면, 무엇?

+0

http://en.wikipedia.org/wiki/Debugger – Isaac

답변

12

양쪽 끝에서 세어 중간에 도달하면 멈출 수 있기 때문에 절반 만 얻을 수 있습니다. 다른 방법을 사용하십시오 : poll() 때마다 size()을 1 줄입니다. 동시에, 당신이 얼마나 많이 제거했는지를 세고 있습니다. 문제는 제거한 숫자가 적어도 나머지 크기보다 클 때 루프가 종료되도록 코딩 한 것입니다. 대신이의

:

for(int x = 0; x < q.size(); x++) 
    System.out.println(q.poll()); 

사용이 :

while (q.size() > 0) 
    System.out.println(q.poll()); 
1

(이건 정말 확장 된 주석입니다 내가 이전 답변에 동의합니다..) 거의 항상

, 때를 API 메소드가 사양을 따르지 않는 것 같습니다. 문제는 테스트 프로그램에 있습니다. 다음 질문은 원래의 질문자가 문제를 보지 않고 진행 상황을 파악할 수 있었던 방법입니다.

디버그의 첫 번째 단계는 정보를 얻는 것입니다. 루프에서 x와 q.size()의 동작은 가능 관련된 것, 그래서 난에 루프를 수정 :

for (int x = 0; x < q.size(); x++) { 
    System.out.println("x=" + x + ", q.size()=" + q.size()); 
    System.out.println(q.poll()); 
    } 

하고 프로그램을 실행했습니다. 출력이었다

x=0, q.size()=20 
    1: one 
    x=1, q.size()=19 
    2: two 
    x=2, q.size()=18 
    3: three 
    x=3, q.size()=17 
    4: four 
    x=4, q.size()=16 
    5: five 
    x=5, q.size()=15 
    6: six 
    x=6, q.size()=14 
    7: seven 
    x=7, q.size()=13 
    8: eight 
    x=8, q.size()=12 
    9: nine 
    x=9, q.size()=11 
    10: ten 

이 출력 X 정지 통해 크기 반쯤 미만되는 원인은 명백 루프의 각 반복은 모두 증가 X 것으로한다 큐의 크기를 감소시킨다.