Bạn có thể thêm kiểm tra an toàn và những gì không, nhưng đây là một thực hiện rất đơn giản sử dụng 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;
}
}
Tôi giả định rằng giá trị nhỏ hơn của priority
tương ứng với các mặt hàng ưu tiên cao hơn (điều này rất dễ dàng để sửa đổi).
Nếu có nhiều chủ đề sẽ truy cập vào hàng đợi, bạn cũng sẽ cần thêm cơ chế khóa. Điều này thật dễ dàng, nhưng hãy cho tôi biết nếu bạn cần hướng dẫn tại đây.
SortedList
được triển khai bên trong dưới dạng cây nhị phân.
Việc triển khai ở trên cần các lớp trợ giúp sau. Địa chỉ này nhận xét của Lasse V. Karlsen rằng các mục có cùng mức độ ưu tiên không thể được thêm vào bằng cách sử dụng triển khai ngây thơ bằng cách sử dụng 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);
}
}
}
Bạn có đang gọi nó từ nhiều luồng không? – sohum
@sohum: Không ... chương trình của tôi * là * luồng, nhưng chỉ một chuỗi sẽ cần truy cập vào nó. – mpen
Lý do mà ngay lập tức xuất hiện trong tâm trí hỗ trợ IComparable là nếu bạn đẩy hai mục vào hàng đợi với mức độ ưu tiên 2, bạn vẫn cần phải so sánh các mục và quyết định thứ tự xử lý hai mục ưu tiên. . . Vì vậy, cuối cùng bạn cần T để có thể so sánh được. Vì vậy, làm thế nào để làm điều này với giao diện của bạn ... Vâng, bạn đã có một số gợi ý tốt dưới đây. –