/* * RapidMiner * * Copyright (C) 2001-2008 by Rapid-I and the contributors * * Complete list of developers available at our web site: * * http://rapid-i.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.tools.math.container; import java.util.Comparator; import java.util.PriorityQueue; /** * This class implements a bounded priority queue which contains always the n-th smalles values. * If a new values is added, its only added if smaller than the greatest value already in queue. * The greatest value is then removed. The iterator does not iterate in any particular order. * This queue will implement a reverse order in compare with the java PriorityQueue, so * peek and poll will retrieve the greatest elements * * @author Sebastian Land * @version $Id: BoundedPriorityQueue.java,v 1.3 2008/07/13 20:38:24 ingomierswa Exp $ * * @param <E> */ public class BoundedPriorityQueue<E> extends PriorityQueue<E> { private static final long serialVersionUID = 6020635755912950637L; private int bound; private Comparator<E> comparator; public BoundedPriorityQueue(int bound) { super(bound, new ReverseComparableComparator<E>()); this.comparator = new ReverseComparableComparator<E>(); this.bound = bound; } public BoundedPriorityQueue(int bound, Comparator<? super E> comp) { super(bound, new ReverseComparator<E>(comp)); this.bound = bound; this.comparator = new ReverseComparator<E>(comp); } public boolean offer(E e) { if (size() == bound) { E head = peek(); // test with Reverse(!) comparator if e is smaller: Test if greater if (comparator.compare(e, head) > 0) { // if smaller: remove biggest and add e poll(); return super.offer(e); } } else { return super.offer(e); } return false; } public boolean add(E e) { return offer(e); } public boolean isFilled() { return (size() == bound); } }