package net.ion.craken.node.crud.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import com.google.common.base.Predicate; public class SortUtil { public static <T> List<T> selectTopN(Iterator<T> values, Predicate<T> filter, Comparator<T> comparator, int top) { Queue<T> topN = new PriorityQueue(100, comparator); while (values.hasNext()) { T value = values.next(); if (value != null && filter != null && filter.apply(value)) { if (topN.size() <= top) { topN.add(value); } else { if (comparator.compare(value, topN.peek()) > 0) { topN.poll(); topN.add(value); } } } } if (topN.isEmpty()) { return Collections.emptyList(); } while (topN.size() > top) { topN.poll(); } List<T> result = new ArrayList(topN); Collections.sort(result, Collections.reverseOrder(comparator)); return result; } public static <T> List<T> selectTopN(Iterator<T> values, Comparator<T> comparator, int top) { return selectTopN(values, (Predicate)null, comparator, top) ; } }