Mega Code Archive

 
Categories / Java / Collections Data Structure
 

List that allows items to be added with a priority that will affect the order in which they are later iterated

//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;         }     } }