C#中如何创建存储int[]的PriorityQueue并以数组首元素为比较依据
C# 实现按int数组首元素排序的PriorityQueue
你要实现存储int[]类型、以数组第一个元素为优先级判定依据的优先队列,对应C#实现如下:
实现方案1:直接使用.NET 6+ 内置PriorityQueue(最简便)
.NET 6 及以上版本提供了内置的PriorityQueue<TElement, TPriority>类型,默认是小顶堆(优先级数值越小越先出队,和Java默认PriorityQueue行为一致),你可以直接指定优先级为int类型,入队时取数组首元素作为优先级传入即可:
// 初始化队列:元素类型为int[],优先级类型为int PriorityQueue<int[], int> pq = new PriorityQueue<int[], int>(); // 入队示例 int[] a = new int[]{2, 7, 9}; int[] b = new int[]{1, 3, 4}; int[] c = new int[]{3, 5, 2}; pq.Enqueue(a, a[0]); pq.Enqueue(b, b[0]); pq.Enqueue(c, c[0]); // 出队顺序:b(首元素1) -> a(首元素2) -> c(首元素3) while(pq.Count > 0) { int[] cur = pq.Dequeue(); Console.WriteLine($"当前出队数组首元素:{cur[0]}"); }
实现方案2:自定义比较器,无需手动传入优先级
如果你希望和Java写法一致,入队时只需要传数组、不需要单独指定优先级,可以自定义比较器实现:
// 自定义数组比较器:按数组首元素排序 public class ArrComparer : IComparer<int[]> { public int Compare(int[]? x, int[]? y) { // 空值排序规则可根据业务需求调整 if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; // 升序(小顶堆),要改成大顶堆只需调换x和y的比较顺序:return y[0].CompareTo(x[0]); return x[0].CompareTo(y[0]); } } // 初始化队列时传入自定义比较器 PriorityQueue<int[], int[]> pq = new PriorityQueue<int[], int[]>(new ArrComparer()); // 入队直接传入数组即可 pq.Enqueue(a, a); pq.Enqueue(b, b); pq.Enqueue(c, c);
说明:如果你的项目使用的是.NET 6以下版本,没有内置优先队列实现,可以自行基于小顶堆/大顶堆数据结构实现优先队列,或引入兼容低版本的第三方优先队列包。
对应Java实现参考截图:
内容的提问来源于stack exchange,提问作者Violet Evergarden
相关产品推荐
相关产品推荐

