2015-04-10 3 views
0

От Java documentation:PEEK() в интерфейсе очереди

УДАЛИТЬ() и опрос() методы удаления и вернуть головку очереди.

Методы element() и peek() возвращают, но не удаляют, голову очереди.

Из второго пункта он говорит, что метод peek() возвращает элемент заголовка очереди, а затем как его не возвращать элемент заголовка очереди в следующей программе?

public class PQ { 

public static void main(String[] args) { 
    PriorityQueue<String> pq = new PriorityQueue<String>(); 
    pq.add("carrot"); 
    pq.add("apple"); 
    pq.add("banana"); 
    System.out.println(pq.poll() + ":" + pq.peek()); // prints apple and banana rather than apple and apple 
} 
} 

После того, как первый элемент (морковь) удаляется, яблоко становится глава очереди (в соответствии с FIFO в очереди), чтобы выглядывать() метод должен возвращать яблочный право?

Example2:

public class PQ { 

public static void main(String[] args) { 
    PriorityQueue<String> pq = new PriorityQueue<String>(); 
    pq.add("carrot"); 
    pq.add("apple"); 
    pq.add("banana"); 
    System.out.println(pq); // prints [apple, carrot, banana] -> it should be [apple, banana, carrot] right? if it is following natural sorting order 
} 
} 
+2

'PriorityQueue' сортирует элементы, значение что порядок вашей очереди (голова) 'яблоко',' банан', 'морковь' (хвост). Таким образом, вызов 'poll()' удаляет и возвращает голову ('apple'), делая' banana' новой головой, как показано в следующем вызове 'peek()'. – Vulcan

+1

так что 'PriorityQueue' не соответствует FIFO? – kittu

+0

Элементы хранятся в порядке, а затем FIFO. В порядке не порядок, в который он вставлен, но порядок приоритета. –

ответ

7

Поскольку вы опрашиваете первый

System.out.println(pq.poll() + ":" + pq.peek()); 

Как это приоритетная очередь элементы сохраняются как

carrot -> banana -> apple 

Когда вы poll() вы получаете apple и удалены из очереди. После чего глава очереди banana, что именно вы получаете, когда вы peek().

ознакомьтесь с примером 2 в обновленном вопросе. Сортировка странная

Это то, чего вы не ожидаете. Вы можете увидеть documentation

Итератора, представленный в методе итераторе() не гарантируются для обхода элементов приоритетной очереди в определенном порядке. Если вам нужно упорядоченное обход, подумайте об использовании массива Arrays.sort (pq.toArray()).

Вы поймете это лучше, если вы прочитаете структуру данных кучи приоритета, в которой используется очередь приоритетов java. Вы должны использовать методы poll(), peek() для получения упорядоченных данных.

+0

. Спасибо: Обратитесь к Баладжи Катике, ответьте выше, я смущен между вашим и его ответом в отношении сортировки элементов. – kittu

+0

По умолчанию он берет естественный порядок. Если вы не хотите, чтобы вы могли передать свой собственный компаратор в конструкторе 'public PriorityQueue (int initialCapacity, Comparator compator)' –

+0

Если вы не поставляете компаратор, используется естественный порядок. И для того, чтобы класс мог нормально упорядочить себя, он должен реализовать интерфейс 'Comparable'. Поскольку вы используете String и String, реализуете 'Comparable', вам не о чем беспокоиться. –

2

Вы используете PriorityQueue и не java.util.Queue (Regular Queue) PriorityQueue сортирует элементы в зависимости от реализации методы Сравнительного :: CompareTo(), который является естественным упорядочением (в алфавитном порядке) для String.class ,

Следовательно, элементы в вашей очереди будут яблочно-банановыми морковками. Выход такой же, как ожидалось

2

Вы сами ответили на вопрос, указав документацию.

Ваша приоритетная очередь содержит

apple, banana, carrot 

poll возвращается "яблоко", а затем удаляет его.Таким образом, очередь теперь

banana, carrot 

peek затем возвращает «банан» метод

2

ОПРОС() удалит этот элемент из очереди и вернуть элемент вызова метода. Метод PEEK() возвращает только этот элемент. передать этот код реализации опроса() и метод PEEK():

public E poll() { 
     if (this.size == 0) 
      return null; 
     int i = --this.size; 
     this.modCount += 1; 
     Object localObject1 = this.queue[0]; 
     Object localObject2 = this.queue[i]; 
     this.queue[i] = null; 
     if (i != 0) 
      siftDown(0, localObject2); 
     return localObject1; 
} 

public E peek() { 
     return ((this.size == 0) ? null : this.queue[0]); 
} 
1

Интерфейс очереди определяет некоторые методы для воздействия на первый элемент списка, которые отличаются в том, как они ведут себя. Эти методы являются:

peek() 
element() 
poll() 
remove() 

РЕЕК() Этот метод возвращает значение первого элемента очереди, не удаляя его из очереди. Для каждого вызова метода мы всегда получаем одно и то же значение, и его выполнение не влияет на размер очереди. Если очередь пуста, метод peek() возвращает значение null.

Элемент() Этот метод ведет себя как peek(), поэтому он снова извлекает значение первого элемента без его удаления. В отличие от peek), однако, если список пуст, элемент() генерирует исключение NoSuchElementException.

Опрос() Этот метод извлекает значение первого элемента очереди, удаляя его из очереди. , При каждом вызове он удаляет первый элемент списка, и если список уже пуст, он возвращает null, но не вызывает никаких исключений.

Командлет Remove() Этот метод ведет себя как метод опроса(), поэтому он удаляет первый элемент из списка и если список пуст, бросает NoSuchElementException

Смежные вопросы