Usted puede agregar controles de seguridad y lo que no, pero aquí hay una aplicación muy sencilla usando SortedList
:
class PriorityQueue<T> {
SortedList<Pair<int>, T> _list;
int count;
public PriorityQueue() {
_list = new SortedList<Pair<int>, T>(new PairComparer<int>());
}
public void Enqueue(T item, int priority) {
_list.Add(new Pair<int>(priority, count), item);
count++;
}
public T Dequeue() {
T item = _list[_list.Keys[0]];
_list.RemoveAt(0);
return item;
}
}
Estoy asumiendo que los valores más pequeños de priority
corresponden a los elementos de mayor prioridad (esto es fácil de modificar)
Si hay varios hilos que accederán a la cola, deberá agregar también un mecanismo de bloqueo. Esto es fácil, pero avíseme si necesita orientación aquí.
SortedList
se implementa internamente como un árbol binario.
La implementación anterior necesita las siguientes clases de ayuda. Esta dirección Lasse V. Comentario de Karlsen que los elementos con la misma prioridad no se pueden agregar usando la implementación ingenua usando un SortedList
.
class Pair<T> {
public T First { get; private set; }
public T Second { get; private set; }
public Pair(T first, T second) {
First = first;
Second = second;
}
public override int GetHashCode() {
return First.GetHashCode()^Second.GetHashCode();
}
public override bool Equals(object other) {
Pair<T> pair = other as Pair<T>;
if (pair == null) {
return false;
}
return (this.First.Equals(pair.First) && this.Second.Equals(pair.Second));
}
}
class PairComparer<T> : IComparer<Pair<T>> where T : IComparable {
public int Compare(Pair<T> x, Pair<T> y) {
if (x.First.CompareTo(y.First) < 0) {
return -1;
}
else if (x.First.CompareTo(y.First) > 0) {
return 1;
}
else {
return x.Second.CompareTo(y.Second);
}
}
}
¿Lo va a llamar desde varios hilos? – sohum
@sohum: No ... mi programa * está * enhebrado, pero solo un hilo necesitará acceder a él. – mpen
La razón por la que inmediatamente surge la idea de que T admite IComparable es que si inserta dos elementos en la cola con prioridad 2, aún necesita comparar los elementos y decidir en qué orden procesar los dos elementos prioritarios. . . Entonces, en definitiva, necesitas que T sea comparable. Entonces, ¿cómo hacer esto con su interfaz ... Bueno, usted tiene algunas buenas sugerencias a continuación. –