1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A PriorityQueue holds elements on a priority heap, which orders the elements 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * according to their natural order or according to the comparator specified at 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * construction time. If the queue uses natural ordering, only elements that are 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * comparable are permitted to be inserted into the queue. 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The least element of the specified ordering is stored at the head of the 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue and the greatest element is stored at the tail of the queue. 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A PriorityQueue is not synchronized. If multiple threads will have to access 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it concurrently, use the {@link java.util.concurrent.PriorityBlockingQueue}. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class PriorityQueue<E> extends AbstractQueue<E> implements Serializable { 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -7720805057305804111L; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int DEFAULT_CAPACITY = 11; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final double DEFAULT_INIT_CAPACITY_RATIO = 1.1; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int DEFAULT_CAPACITY_RATIO = 2; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int size; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Comparator<? super E> comparator; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private transient E[] elements; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue with an initial capacity of 11 and natural 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ordering. 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue() { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(DEFAULT_CAPACITY); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue with the specified capacity and natural 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ordering. 62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param initialCapacity 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified capacity. 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the initialCapacity is less than 1. 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue(int initialCapacity) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(initialCapacity, null); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue with the specified capacity and comparator. 74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param initialCapacity 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified capacity. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param comparator 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified comparator. If it is null, the natural ordering 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be used. 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the initialCapacity is less than 1. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (initialCapacity < 1) { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements = newElementArray(initialCapacity); 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.comparator = comparator; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue that contains the elements of a collection. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The constructed priority queue has the initial capacity of 110% of the 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size of the collection. The queue uses natural ordering to order its 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements. 96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collection whose elements will be added to the priority 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue to be constructed. 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any of the elements in the collection are not comparable. 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any of the elements in the collection are null. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue(Collection<? extends E> c) { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c instanceof PriorityQueue) { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getFromPriorityQueue((PriorityQueue<? extends E>) c); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (c instanceof SortedSet) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getFromSortedSet((SortedSet<? extends E>) c); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSize(c); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project addAll(c); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue that contains the elements of another 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * priority queue. The constructed priority queue has the initial capacity 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of 110% of the specified one. Both priority queues have the same 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * comparator. 121f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the priority queue whose elements will be added to the 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * priority queue to be constructed. 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue(PriorityQueue<? extends E> c) { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getFromPriorityQueue(c); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a priority queue that contains the elements of a sorted set. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The constructed priority queue has the initial capacity of 110% of the 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size of the sorted set. The priority queue will have the same comparator 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as the sorted set. 135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the sorted set whose elements will be added to the priority 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue to be constructed. 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PriorityQueue(SortedSet<? extends E> c) { 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getFromSortedSet(c); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the iterator of the priority queue, which will not return elements 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in any specified ordering. 147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the iterator of the priority queue. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<E> iterator() { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new PriorityIterator(); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the size of the priority queue. If the size of the queue is greater 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than the Integer.MAX, then it returns Integer.MAX. 158f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the size of the priority queue. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return size; 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes all the elements of the priority queue. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.fill(elements, null); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = 0; 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Inserts the element to the priority queue. 177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param o 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element to add to the priority queue. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return always true 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the element cannot be compared with the elements in the 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * priority queue using the ordering of the priority queue. 184f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws NullPointerException 185f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * if {@code o} is {@code null}. 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean offer(E o) { 188b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (o == null) { 18986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("o == null"); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project growToSize(size + 1); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[size] = o; 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project siftUp(size++); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets and removes the head of the queue. 199f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the head of the queue or null if the queue is empty. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E poll() { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isEmpty()) { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E result = elements[0]; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project removeAt(0); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets but does not remove the head of the queue. 213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the head of the queue or null if the queue is empty. 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E peek() { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isEmpty()) { 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elements[0]; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the comparator of the priority queue. 225f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the comparator of the priority queue or null if the natural 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ordering is used. 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Comparator<? super E> comparator() { 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return comparator; 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes the specified object from the priority queue. 235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param o 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to be removed. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if the object was in the priority queue, false if the object 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * was not in the priority queue. 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean remove(Object o) { 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (o == null) { 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 247509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe for (int targetIndex = 0; targetIndex < size; targetIndex++) { 248509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe if (o.equals(elements[targetIndex])) { 249509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe removeAt(targetIndex); 250509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe return true; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe return false; 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Adds the specified object to the priority queue. 258f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param o 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to be added. 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return always true. 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the element cannot be compared with the elements in the 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * priority queue using the ordering of the priority queue. 265f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws NullPointerException 266f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * if {@code o} is {@code null}. 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean add(E o) { 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return offer(o); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private class PriorityIterator implements Iterator<E> { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int currentIndex = -1; 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean allowRemove = false; 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNext() { 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentIndex < size - 1; 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E next() { 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!hasNext()) { 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project allowRemove = true; 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elements[++currentIndex]; 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void remove() { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!allowRemove) { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException(); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project allowRemove = false; 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project removeAt(currentIndex--); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readObject(ObjectInputStream in) throws IOException, 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException { 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.defaultReadObject(); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int capacity = in.readInt(); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements = newElementArray(capacity); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[i] = (E) in.readObject(); 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private E[] newElementArray(int capacity) { 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (E[]) new Object[capacity]; 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream out) throws IOException { 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project out.defaultWriteObject(); 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project out.writeInt(elements.length); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project out.writeObject(elements[i]); 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void getFromPriorityQueue(PriorityQueue<? extends E> c) { 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSize(c); 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project comparator = (Comparator<? super E>) c.comparator(); 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(c.elements, 0, elements, 0, c.size()); 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = c.size(); 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void getFromSortedSet(SortedSet<? extends E> c) { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSize(c); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project comparator = (Comparator<? super E>) c.comparator(); 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends E> iter = c.iterator(); 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (iter.hasNext()) { 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[size++] = iter.next(); 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void removeAt(int index) { 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size--; 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[index] = elements[size]; 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project siftDown(index); 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[size] = null; 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int compare(E o1, E o2) { 350b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (comparator != null) { 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return comparator.compare(o1, o2); 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Comparable<? super E>) o1).compareTo(o2); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void siftUp(int childIndex) { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E target = elements[childIndex]; 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int parentIndex; 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (childIndex > 0) { 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parentIndex = (childIndex - 1) / 2; 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E parent = elements[parentIndex]; 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (compare(parent, target) <= 0) { 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[childIndex] = parent; 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project childIndex = parentIndex; 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[childIndex] = target; 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void siftDown(int rootIndex) { 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E target = elements[rootIndex]; 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int childIndex; 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while ((childIndex = rootIndex * 2 + 1) < size) { 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (childIndex + 1 < size 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && compare(elements[childIndex + 1], elements[childIndex]) < 0) { 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project childIndex++; 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (compare(target, elements[childIndex]) <= 0) { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[rootIndex] = elements[childIndex]; 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project rootIndex = childIndex; 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements[rootIndex] = target; 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void initSize(Collection<? extends E> c) { 389b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (c == null) { 39086acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("c == null"); 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c.isEmpty()) { 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements = newElementArray(1); 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int capacity = (int) Math.ceil(c.size() 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DEFAULT_INIT_CAPACITY_RATIO); 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements = newElementArray(capacity); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void growToSize(int size) { 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size > elements.length) { 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E[] newElements = newElementArray(size * DEFAULT_CAPACITY_RATIO); 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(elements, 0, newElements, 0, elements.length); 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elements = newElements; 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 409