/**
*
*/
package fr.unistra.pelican.util;
import java.util.Collections;
import java.util.TreeMap;
/**
* Prioritized queue.
*
* Can handle any type of objects and any type of priority.
*
* Implementation relies on SortedList
*
* @author Benjamin Perret
*
* @param <E> element type
* @param <T> priority type (anything implementing the interface Comparable)
*/
public class PriorityQueue<E,T extends Comparable<? super T>> extends TreeMap<PriorityQueue.PrioritizedElement<E,T>,PriorityQueue.PrioritizedElement<E,T>> {
public static enum PriorityPolicy{LowestHasPriority,HighestHasPriority };
private PriorityPolicy policy=PriorityPolicy.LowestHasPriority;
/**
* Default constructor
*/
public PriorityQueue() {
super();
}
/**
* Default constructor
*/
public PriorityQueue(PriorityPolicy policy) {
super((policy.equals(PriorityPolicy.HighestHasPriority)?Collections.reverseOrder():null));
this.policy=policy;
}
/**
* Construct queue with initial size n.
* @param n initial size
*/
public PriorityQueue(int n) {
super();
}
/**
* Add an element with given priority
* @param element
* @param priority
*/
public void add(E element, T priority)
{
PrioritizedElement<E,T> pe=new PrioritizedElement<E,T>(element,priority);
this.put(pe,pe);
}
/**
* Add an element with given priority
*/
public void add(PrioritizedElement<E,T> pe)
{
this.put(pe,pe);
}
/**
* Add an element with given priority
* @param element
* @param priority
*/
/* public void insertAndReplace(E element, T priority)
{
tmp.element=element;
PrioritizedElement<E,T> pe=get(tmp);
if(pe != null && pe.priority.compareTo(priority)<0)
{
remove(tmp);
pe.priority=priority;
put(pe,pe);
} else{
pe=new PrioritizedElement<E,T>(element,priority);
put(pe,pe);
}
}*/
/*private int whereIsNext()
{
if (policy == PriorityPolicy.LowestHasPriority)
return 0;
else return size()-1;
}*/
private PrioritizedElement<E,T> tmp= new PrioritizedElement<E,T>();
public boolean contains(E element)
{
tmp.element=element;
return containsValue(tmp);
}
/*public PrioritizedElement<E,T> get(E element){
PrioritizedElement<E,T> res=null;
tmp.element=element;
/int i= indexOf(tmp);
if(i>=0)
res= get(i);
return res;
}*/
/* (non-Javadoc)
* @see java.util.ArrayList#remove(java.lang.Object)
*/
/*@Override
public boolean remove(Object o) {
tmp.element=o;
return super.remove(tmp);
}*/
/*public void remove(Object element)
{
tmp.element=element;
return;
}*/
/**
* Get element of highest priority and remove it from list
* @return element of highest
*/
public E popElement()
{
/*int s=whereIsNext();//size()-1;
PrioritizedElement<E, T> e = this.get(s);
this.remove(s);
return e.getElement();*/
return firstEntry().getValue().element;
}
/**
* Get element of highest priority and leave it in the list
* @return element of highest
*/
public E peekElement()
{
//return this.get(size()-1).getElement();
//return this.get(whereIsNext()).getElement();
return peek().element;
}
/**
*
* @return
*/
public PrioritizedElement<E,T> pop()
{
/*int s=whereIsNext();//size()-1;
PrioritizedElement<E, T> e = this.get(s);
this.remove(s);
return e;*/
PrioritizedElement<E, T> e=firstKey();
remove(e);
return e;
}
public PrioritizedElement<E,T> peek()
{
//return this.get(size()-1);
//return this.get(whereIsNext());
return firstKey();
}
public void dropContentToOutputStream()
{
System.out.println(toString());
}
/**
* Small class to group element and priority
*
* @author Benjamin Perret
*
* @param <E>
* @param <T>
*/
public static class PrioritizedElement<E,T extends Comparable<? super T>> implements Comparable<PrioritizedElement<?,T>>
{
private static long count=0;
/**
* element
*/
private E element;
/**
* priority
*/
private T priority;
private long id=0;
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(PrioritizedElement<?, T> o) {
int c=priority.compareTo(o.priority);
if (c==0)
{
if(id < o.id)
c=-1;
else if(id>o.id)
c=1;
}
return c;
}
public PrioritizedElement(){
id=count++;
}
/**
* @param element
* @param priority
*/
public PrioritizedElement(E element, T priority) {
this();
this.element = element;
this.priority = priority;
}
/**
* @return
*/
public E getElement() {
return element;
}
/**
* @param element
*/
public void setElement(E element) {
this.element = element;
}
/**
* @return
*/
public T getPriority() {
return priority;
}
public void setPriority(T priority) {
this.priority = priority;
}
public String toString()
{
return "("+element + "," +priority + ")";
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
boolean res=false;
if(obj!=null && obj instanceof PrioritizedElement)
{
res=element.equals(((PrioritizedElement)obj).element);
}
return res;
}
}
}