//package com.thoughtworks.xstream.core.util;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* List that allows items to be added with a priority that will affect the order in which they are later iterated over.
* Objects with a high priority will appear before objects with a low priority in the list. If two objects of the same
* priority are added to the list, the most recently added one will be iterated over first. Implementation uses a
* TreeSet, which has a garanteed add time of O(log(n)).
*
* @author Joe Walnes
* @author Guilherme Silveira
*/
public class PrioritizedList {
private final Set set = new TreeSet();
private int lowestPriority = Integer.MAX_VALUE;
private int lastId = 0;
public void add(Object item, int priority) {
if (this.lowestPriority > priority) {
this.lowestPriority = priority;
}
this.set.add(new PrioritizedItem(item, priority, ++lastId));
}
public Iterator iterator() {
return new PrioritizedItemIterator(this.set.iterator());
}
private static class PrioritizedItem implements Comparable {
final Object value;
final int priority;
final int id;
public PrioritizedItem(Object value, int Prioritized, int id) {
this.value = value;
this.priority = Prioritized;
this.id = id;
}
public int compareTo(Object o) {
PrioritizedItem other = (PrioritizedItem)o;
if (this.priority != other.priority) {
return (other.priority - this.priority);
}
return (other.id - this.id);
}
public boolean equals(Object obj) {
return this.id == ((PrioritizedItem)obj).id;
}
}
private static class PrioritizedItemIterator implements Iterator {
private Iterator iterator;
public PrioritizedItemIterator(Iterator iterator) {
this.iterator = iterator;
}
public void remove() {
// call iterator.remove()?
throw new UnsupportedOperationException();
}
public boolean hasNext() {
return iterator.hasNext();
}
public Object next() {
return ((PrioritizedItem)iterator.next()).value;
}
}
}