package com.google.code.joto.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
* extension of java.util.List for supporting sorting with priority
*/
public class PriorityList<T> implements Iterable<T>, Serializable {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private final Set<Item<T>> set = new TreeSet<Item<T>>();
private int idGenerator = 0;
//-------------------------------------------------------------------------
public PriorityList() {
}
//-------------------------------------------------------------------------
public void add(T item, int priority) {
this.set.add(new Item<T>(item, priority, ++idGenerator));
}
/**
* implements Iterable<T> ... return a sorted iterator (on a temporary copy)
*/
@Override
public Iterator<T> iterator() {
List<T> tmp = new ArrayList<T>(set.size());
for(Item<T> item : set) {
tmp.add(item.value);
}
return tmp.iterator();
}
public void addAllWithPriority(PriorityList<T> src) {
for(Item<T> srcItem : src.set) {
add(srcItem.value, srcItem.priority);
}
}
// -------------------------------------------------------------------------
/**
* internal
*/
private static class Item<T> implements Comparable<Item<T>>, Serializable {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private final T value;
private final int priority;
private final int id; // for comparing with equals priority
public Item(T value, int priority, int id) {
this.value = value;
this.priority = priority;
this.id = id;
}
public int compareTo(Item<T> other) {
if (this.priority != other.priority) {
return (other.priority - this.priority);
}
return (other.id - this.id);
}
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof Item<?>)) return false;
return this.id == ((Item<?>)obj).id;
}
}
}