Example usage for java.util PriorityQueue PriorityQueue

List of usage examples for java.util PriorityQueue PriorityQueue

Introduction

In this page you can find the example usage for java.util PriorityQueue PriorityQueue.

Prototype

public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) 

Source Link

Document

Creates a PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.

Usage

From source file:mondrian.olap.fun.FunUtil.java

/**
 * Julian's algorithm for stable partial sort. Improves Pedro's algorithm
 * by using a heap (priority queue) for the top {@code limit} items seen.
 * The items on the priority queue have an ordinal field, so the queue
 * can be used to generate a list of stably sorted items. (Heap sort is
 * not normally stable.)/*from w  ww . ja v a2  s . co m*/
 *
 * @param list List to sort
 * @param comp Comparator
 * @param limit Maximum number of items to return
 * @param <T> Element type
 * @return Sorted list, containing at most limit items
 */
public static <T> List<T> stablePartialSortJulian(final List<T> list, final Comparator<T> comp, int limit) {
    final Comparator<ObjIntPair<T>> comp2 = new Comparator<ObjIntPair<T>>() {
        public int compare(ObjIntPair<T> o1, ObjIntPair<T> o2) {
            int c = comp.compare(o1.t, o2.t);
            if (c == 0) {
                c = Util.compare(o1.i, o2.i);
            }
            return -c;
        }
    };
    int filled = 0;
    final PriorityQueue<ObjIntPair<T>> queue = new PriorityQueue<ObjIntPair<T>>(limit, comp2);
    for (T element : list) {
        if (filled < limit) {
            queue.offer(new ObjIntPair<T>(element, filled++));
        } else {
            ObjIntPair<T> head = queue.element();
            if (comp.compare(element, head.t) <= 0) {
                ObjIntPair<T> item = new ObjIntPair<T>(element, filled++);
                if (comp2.compare(item, head) >= 0) {
                    ObjIntPair poll = queue.remove();
                    Util.discard(poll);
                    queue.offer(item);
                }
            }
        }
    }

    int n = queue.size();
    final Object[] elements = new Object[n];
    while (n > 0) {
        elements[--n] = queue.poll().t;
    }
    assert queue.isEmpty();
    //noinspection unchecked
    return Arrays.asList((T[]) elements);
}

From source file:org.apache.accumulo.tserver.tablet.Tablet.java

private Set<FileRef> removeSmallest(Map<FileRef, DataFileValue> filesToCompact, int maxFilesToCompact) {
    // ensure this method works properly when multiple files have the same size

    // short-circuit; also handles zero files case
    if (filesToCompact.size() <= maxFilesToCompact) {
        Set<FileRef> smallestFiles = new HashSet<FileRef>(filesToCompact.keySet());
        filesToCompact.clear();/*from   www.ja v a2  s  .co  m*/
        return smallestFiles;
    }

    PriorityQueue<Pair<FileRef, Long>> fileHeap = new PriorityQueue<Pair<FileRef, Long>>(filesToCompact.size(),
            new Comparator<Pair<FileRef, Long>>() {
                @Override
                public int compare(Pair<FileRef, Long> o1, Pair<FileRef, Long> o2) {
                    if (o1.getSecond() == o2.getSecond())
                        return o1.getFirst().compareTo(o2.getFirst());
                    if (o1.getSecond() < o2.getSecond())
                        return -1;
                    return 1;
                }
            });

    for (Iterator<Entry<FileRef, DataFileValue>> iterator = filesToCompact.entrySet().iterator(); iterator
            .hasNext();) {
        Entry<FileRef, DataFileValue> entry = iterator.next();
        fileHeap.add(new Pair<FileRef, Long>(entry.getKey(), entry.getValue().getSize()));
    }

    Set<FileRef> smallestFiles = new HashSet<FileRef>();
    while (smallestFiles.size() < maxFilesToCompact && fileHeap.size() > 0) {
        Pair<FileRef, Long> pair = fileHeap.remove();
        filesToCompact.remove(pair.getFirst());
        smallestFiles.add(pair.getFirst());
    }

    return smallestFiles;
}

From source file:org.apache.accumulo.server.tabletserver.Tablet.java

private Set<FileRef> removeSmallest(Map<FileRef, Long> filesToCompact, int maxFilesToCompact) {
    // ensure this method works properly when multiple files have the same size

    PriorityQueue<Pair<FileRef, Long>> fileHeap = new PriorityQueue<Pair<FileRef, Long>>(filesToCompact.size(),
            new Comparator<Pair<FileRef, Long>>() {
                @Override/*w  w w. j a  v  a  2  s .c  o  m*/
                public int compare(Pair<FileRef, Long> o1, Pair<FileRef, Long> o2) {
                    if (o1.getSecond() == o2.getSecond())
                        return o1.getFirst().compareTo(o2.getFirst());
                    if (o1.getSecond() < o2.getSecond())
                        return -1;
                    return 1;
                }
            });

    for (Iterator<Entry<FileRef, Long>> iterator = filesToCompact.entrySet().iterator(); iterator.hasNext();) {
        Entry<FileRef, Long> entry = iterator.next();
        fileHeap.add(new Pair<FileRef, Long>(entry.getKey(), entry.getValue()));
    }

    Set<FileRef> smallestFiles = new HashSet<FileRef>();
    while (smallestFiles.size() < maxFilesToCompact && fileHeap.size() > 0) {
        Pair<FileRef, Long> pair = fileHeap.remove();
        filesToCompact.remove(pair.getFirst());
        smallestFiles.add(pair.getFirst());
    }

    return smallestFiles;
}

From source file:org.apache.accumulo.tserver.Tablet.java

private Set<FileRef> removeSmallest(Map<FileRef, DataFileValue> filesToCompact, int maxFilesToCompact) {
    // ensure this method works properly when multiple files have the same size

    PriorityQueue<Pair<FileRef, Long>> fileHeap = new PriorityQueue<Pair<FileRef, Long>>(filesToCompact.size(),
            new Comparator<Pair<FileRef, Long>>() {
                @Override/*from   w w w  .  j  a v  a2s  .  co m*/
                public int compare(Pair<FileRef, Long> o1, Pair<FileRef, Long> o2) {
                    if (o1.getSecond() == o2.getSecond())
                        return o1.getFirst().compareTo(o2.getFirst());
                    if (o1.getSecond() < o2.getSecond())
                        return -1;
                    return 1;
                }
            });

    for (Iterator<Entry<FileRef, DataFileValue>> iterator = filesToCompact.entrySet().iterator(); iterator
            .hasNext();) {
        Entry<FileRef, DataFileValue> entry = iterator.next();
        fileHeap.add(new Pair<FileRef, Long>(entry.getKey(), entry.getValue().getSize()));
    }

    Set<FileRef> smallestFiles = new HashSet<FileRef>();
    while (smallestFiles.size() < maxFilesToCompact && fileHeap.size() > 0) {
        Pair<FileRef, Long> pair = fileHeap.remove();
        filesToCompact.remove(pair.getFirst());
        smallestFiles.add(pair.getFirst());
    }

    return smallestFiles;
}