2013-09-24 4 views
0

사용자가 단어를 입력하도록 요청하고 프로그램이 각 문자를 대기열에 저장하는 프로그램의 대기열에 문제가 있습니다. 대기열의 내용을 출력 할 때 글자가 모두 뒤섞입니다. 이것은 대부분의 단어에 발생합니다. 예를 들어 "racecar"를 입력하면 대기열은 [r, a, c, e, c, a, r]이 아닌 [a, c, a, r, e, c, r]로 표시됩니다. 왜 이런 일이 일어나는 지 아십니까?대기열 요소가 순서대로 정렬되어 있지 않습니다.

import java.util.Scanner; 
import java.util.*; 

public class WordQueue 
{ 
    public static void main(String arg[]) 
    { 
     while(true){ 
      String phrase; 
      int phraselength; 
      PriorityQueue queue = new PriorityQueue(); 
      Scanner sc = new Scanner(System.in); 
      System.out.println("Enter a word/phrase"); 
      phrase = sc.nextLine(); 
      phrase = phrase.replaceAll("\\p{Punct}|\\d",""); //remove all punctuation 
      phraselength = phrase.length();     //get length of phrase 
      System.out.println(phraselength); 

      for(int x = 0; x <= phraselength-1; x++)   //store each letter 
      {            //in queue 
       queue.offer(phrase.charAt(x));  
      } 

      System.out.println(""); 

       System.out.printf("%s ", queue);    //output queue 

     } 
    } 
} 
+1

[PriorityQueue]에 대한 [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html)에서 우선 순위 큐의 요소는 다음에 따라 정렬됩니다. 그들의 자연 순서. – GriffeyDog

답변

1

PriorityQueue의 요소는 가장 작은 요소 인 헤드를 제외하고는 특정 순서를 따르지 않습니다. 특히, 반복 순서는 정의되지 않습니다. 대기열에서 연속적으로 remove이라면 자연 순서 (예제에서는 알파벳순)로 요소를 가져옵니다.

어쨌든 그것은 아마도 당신이 필요로하지 않습니다. 왜 대신 스택을 사용하지 않으시겠습니까?

+0

빠른 검색을 통해 답을 얻을 수 있지만 LIFO : Stack, FIFO : 대부분의 대기열 (예 : LinkedList 또는 ArrayBlockingQueue). – assylias

+0

Gotcha, 많은 감사. – TheEyesHaveIt

0

PriorityQueue은 FIFO 큐가 아닙니다. 우선 순위가 가장 높은 요소가 항상 대기열의 맨 위에 오도록 요소를 정렬합니다. LinkedList을 사용하십시오.

관련 문제