react-native-fxview 1.0.2-beta1 → 1.0.2-beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1,5 +1,3 @@
1
1
  export { default as FXView } from "./FXView";
2
2
  export { FXViewManager } from "./FXViewManager";
3
- export { FXViewController } from "./FXViewController";
4
- export { FXCategoryController } from "./FXCategoryController";
5
3
  export * from "./types";
package/index.js CHANGED
@@ -17,14 +17,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.FXCategoryController = exports.FXViewController = exports.FXViewManager = exports.FXView = void 0;
20
+ exports.FXViewManager = exports.FXView = void 0;
21
21
  // 主入口文件
22
22
  var FXView_1 = require("./FXView");
23
23
  Object.defineProperty(exports, "FXView", { enumerable: true, get: function () { return __importDefault(FXView_1).default; } });
24
24
  var FXViewManager_1 = require("./FXViewManager");
25
25
  Object.defineProperty(exports, "FXViewManager", { enumerable: true, get: function () { return FXViewManager_1.FXViewManager; } });
26
- var FXViewController_1 = require("./FXViewController");
27
- Object.defineProperty(exports, "FXViewController", { enumerable: true, get: function () { return FXViewController_1.FXViewController; } });
28
- var FXCategoryController_1 = require("./FXCategoryController");
29
- Object.defineProperty(exports, "FXCategoryController", { enumerable: true, get: function () { return FXCategoryController_1.FXCategoryController; } });
30
26
  __exportStar(require("./types"), exports);
package/index.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  // 主入口文件
2
2
  export { default as FXView } from "./FXView";
3
3
  export { FXViewManager } from "./FXViewManager";
4
- export { FXViewController } from "./FXViewController";
5
- export { FXCategoryController } from "./FXCategoryController";
6
4
  export * from "./types";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-fxview",
3
- "version": "1.0.2-beta1",
3
+ "version": "1.0.2-beta2",
4
4
  "description": "A dynamic view component for React Native that allows runtime UI updates and component management",
5
5
  "main": "index.ts",
6
6
  "types": "index.d.ts",
@@ -8,6 +8,10 @@
8
8
  "*.js",
9
9
  "*.ts",
10
10
  "*.tsx",
11
+ "*.d.ts",
12
+ "queue/**/*.js",
13
+ "queue/**/*.ts",
14
+ "queue/**/*.d.ts",
11
15
  "README.md",
12
16
  "LICENSE"
13
17
  ],
@@ -0,0 +1,153 @@
1
+ /**
2
+ * 通用的优先级队列 - 支持泛型存储,可切换大顶堆/小顶堆模式
3
+ * 支持优先级相同时的排序策略:先入先出(FIFO)或后入先出(LIFO)
4
+ */
5
+ export declare enum HeapType {
6
+ MAX_HEAP = "max",// 大顶堆:优先级高的在前
7
+ MIN_HEAP = "min"
8
+ }
9
+ export declare enum PriorityOrder {
10
+ FIFO = "fifo",// 先入先出:优先级相同时,先入队的在前
11
+ LIFO = "lifo"
12
+ }
13
+ export declare class PriorityQueue<T> {
14
+ private items;
15
+ private heapType;
16
+ private priorityOrder;
17
+ constructor(heapType?: HeapType, priorityOrder?: PriorityOrder);
18
+ /**
19
+ * 设置堆类型(可选参数)
20
+ */
21
+ setHeapType(heapType?: HeapType): void;
22
+ /**
23
+ * 获取当前堆类型
24
+ */
25
+ getHeapType(): HeapType;
26
+ /**
27
+ * 设置优先级相同时的排序策略(可选参数)
28
+ */
29
+ setPriorityOrder(order?: PriorityOrder): void;
30
+ /**
31
+ * 获取当前优先级相同时的排序策略
32
+ */
33
+ getPriorityOrder(): PriorityOrder;
34
+ /**
35
+ * 入队 - 按当前堆类型和排序策略排序
36
+ */
37
+ enqueue(item: T, priority?: number, timestamp?: number): void;
38
+ /**
39
+ * 批量入队(可选参数)
40
+ */
41
+ enqueueMultiple(items: T[], priority?: number): void;
42
+ /**
43
+ * 出队 - 返回队首元素(最高或最低优先级)
44
+ */
45
+ dequeue(): T | null;
46
+ /**
47
+ * 批量出队(可选参数)
48
+ */
49
+ dequeueMultiple(count?: number): T[];
50
+ /**
51
+ * 查看队首元素(不移除)
52
+ */
53
+ peek(): T | null;
54
+ /**
55
+ * 查看队首元素的优先级
56
+ */
57
+ peekPriority(): number | null;
58
+ /**
59
+ * 查看前N个元素(可选参数)
60
+ */
61
+ peekMultiple(count?: number): T[];
62
+ /**
63
+ * 队列是否为空
64
+ */
65
+ isEmpty(): boolean;
66
+ /**
67
+ * 队列大小
68
+ */
69
+ size(): number;
70
+ /**
71
+ * 清空队列
72
+ */
73
+ clear(): void;
74
+ /**
75
+ * 获取所有元素(按当前堆类型排序)
76
+ */
77
+ getAll(): T[];
78
+ /**
79
+ * 获取所有元素及其优先级
80
+ */
81
+ getAllWithPriority(): Array<{
82
+ item: T;
83
+ priority: number;
84
+ }>;
85
+ /**
86
+ * 获取所有元素及其详细信息
87
+ */
88
+ getAllWithDetails(): Array<{
89
+ item: T;
90
+ priority: number;
91
+ timestamp: number;
92
+ }>;
93
+ /**
94
+ * 获取指定索引的元素(可选参数)
95
+ */
96
+ getAt(index?: number): T | null;
97
+ /**
98
+ * 获取指定范��的元素(可选参数)
99
+ */
100
+ getRange(start?: number, end?: number): T[];
101
+ /**
102
+ * 移除指定元素
103
+ */
104
+ remove(item: T): boolean;
105
+ /**
106
+ * 移除指定索引的元素(可选参数)
107
+ */
108
+ removeAt(index?: number): T | null;
109
+ /**
110
+ * 更新元素的优先级
111
+ */
112
+ updatePriority(item: T, newPriority?: number): boolean;
113
+ /**
114
+ * 查找指定元素
115
+ */
116
+ find(predicate: (item: T) => boolean): T | null;
117
+ /**
118
+ * 查找所有符合条件的元素
119
+ */
120
+ findAll(predicate: (item: T) => boolean): T[];
121
+ /**
122
+ * 过滤元素
123
+ */
124
+ filter(predicate: (item: T) => boolean): T[];
125
+ /**
126
+ * 遍历元素
127
+ */
128
+ forEach(callback: (item: T, priority: number, index: number) => void): void;
129
+ /**
130
+ * 映射元素
131
+ */
132
+ map<U>(callback: (item: T, priority: number, index: number) => U): U[];
133
+ /**
134
+ * 判断是否应该插入到指定元素之前
135
+ */
136
+ private shouldInsertBefore;
137
+ /**
138
+ * 重新排序所有元素
139
+ */
140
+ private resort;
141
+ /**
142
+ * 转换为数组
143
+ */
144
+ toArray(): T[];
145
+ /**
146
+ * 转换为JSON字符串
147
+ */
148
+ toJSON(): string;
149
+ /**
150
+ * 克隆队列
151
+ */
152
+ clone(): PriorityQueue<T>;
153
+ }
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PriorityQueue = exports.PriorityOrder = exports.HeapType = void 0;
4
+ /**
5
+ * 通用的优先级队列 - 支持泛型存储,可切换大顶堆/小顶堆模式
6
+ * 支持优先级相同时的排序策略:先入先出(FIFO)或后入先出(LIFO)
7
+ */
8
+ var HeapType;
9
+ (function (HeapType) {
10
+ HeapType["MAX_HEAP"] = "max";
11
+ HeapType["MIN_HEAP"] = "min";
12
+ })(HeapType || (exports.HeapType = HeapType = {}));
13
+ var PriorityOrder;
14
+ (function (PriorityOrder) {
15
+ PriorityOrder["FIFO"] = "fifo";
16
+ PriorityOrder["LIFO"] = "lifo";
17
+ })(PriorityOrder || (exports.PriorityOrder = PriorityOrder = {}));
18
+ class PriorityQueue {
19
+ constructor(heapType = HeapType.MAX_HEAP, priorityOrder = PriorityOrder.FIFO) {
20
+ this.items = [];
21
+ this.heapType = heapType;
22
+ this.priorityOrder = priorityOrder;
23
+ }
24
+ /**
25
+ * 设置堆类型(可选参数)
26
+ */
27
+ setHeapType(heapType) {
28
+ if (heapType !== undefined && this.heapType !== heapType) {
29
+ this.heapType = heapType;
30
+ this.resort();
31
+ }
32
+ }
33
+ /**
34
+ * 获取当前堆类型
35
+ */
36
+ getHeapType() {
37
+ return this.heapType;
38
+ }
39
+ /**
40
+ * 设置优先级相同时的排序策略(可选参数)
41
+ */
42
+ setPriorityOrder(order) {
43
+ if (order !== undefined && this.priorityOrder !== order) {
44
+ this.priorityOrder = order;
45
+ this.resort();
46
+ }
47
+ }
48
+ /**
49
+ * 获取当前优先级相同时的排序策略
50
+ */
51
+ getPriorityOrder() {
52
+ return this.priorityOrder;
53
+ }
54
+ /**
55
+ * 入队 - 按当前堆类型和排序策略排序
56
+ */
57
+ enqueue(item, priority = 0, timestamp) {
58
+ const newTimestamp = timestamp !== undefined ? timestamp : Date.now();
59
+ // 如果 item 已存在,移除旧项
60
+ const existingIndex = this.items.findIndex((entry) => entry.item === item);
61
+ if (existingIndex !== -1) {
62
+ this.items.splice(existingIndex, 1);
63
+ }
64
+ const newItem = {
65
+ item,
66
+ priority,
67
+ timestamp: newTimestamp,
68
+ };
69
+ // 根据堆类型和排序策略找到插入位置
70
+ let insertIndex = this.items.length;
71
+ for (let i = 0; i < this.items.length; i++) {
72
+ if (this.shouldInsertBefore(newItem, this.items[i])) {
73
+ insertIndex = i;
74
+ break;
75
+ }
76
+ }
77
+ this.items.splice(insertIndex, 0, newItem);
78
+ }
79
+ /**
80
+ * 批量入队(可选参数)
81
+ */
82
+ enqueueMultiple(items, priority = 0) {
83
+ items.forEach((item) => this.enqueue(item, priority));
84
+ }
85
+ /**
86
+ * 出队 - 返回队首元素(最高或最低优先级)
87
+ */
88
+ dequeue() {
89
+ if (this.isEmpty()) {
90
+ return null;
91
+ }
92
+ return this.items.shift().item;
93
+ }
94
+ /**
95
+ * 批量出队(可选参数)
96
+ */
97
+ dequeueMultiple(count) {
98
+ if (count === undefined) {
99
+ count = this.items.length;
100
+ }
101
+ const result = [];
102
+ for (let i = 0; i < count && !this.isEmpty(); i++) {
103
+ const item = this.dequeue();
104
+ if (item !== null) {
105
+ result.push(item);
106
+ }
107
+ }
108
+ return result;
109
+ }
110
+ /**
111
+ * 查看队首元素(不移除)
112
+ */
113
+ peek() {
114
+ if (this.isEmpty()) {
115
+ return null;
116
+ }
117
+ return this.items[0].item;
118
+ }
119
+ /**
120
+ * 查看队首元素的优先级
121
+ */
122
+ peekPriority() {
123
+ if (this.isEmpty()) {
124
+ return null;
125
+ }
126
+ return this.items[0].priority;
127
+ }
128
+ /**
129
+ * 查看前N个元素(可选参数)
130
+ */
131
+ peekMultiple(count) {
132
+ if (count === undefined) {
133
+ count = this.items.length;
134
+ }
135
+ return this.items
136
+ .slice(0, Math.min(count, this.items.length))
137
+ .map((entry) => entry.item);
138
+ }
139
+ /**
140
+ * 队列是否为空
141
+ */
142
+ isEmpty() {
143
+ return this.items.length === 0;
144
+ }
145
+ /**
146
+ * 队列大小
147
+ */
148
+ size() {
149
+ return this.items.length;
150
+ }
151
+ /**
152
+ * 清空队列
153
+ */
154
+ clear() {
155
+ this.items = [];
156
+ }
157
+ /**
158
+ * 获取所有元素(按当前堆类型排序)
159
+ */
160
+ getAll() {
161
+ return this.items.map((entry) => entry.item);
162
+ }
163
+ /**
164
+ * 获取所有元素及其优先级
165
+ */
166
+ getAllWithPriority() {
167
+ return this.items.map(({ item, priority }) => ({ item, priority }));
168
+ }
169
+ /**
170
+ * 获取所有元素及其详细信息
171
+ */
172
+ getAllWithDetails() {
173
+ return [...this.items];
174
+ }
175
+ /**
176
+ * 获取指定索引的元素(可选参数)
177
+ */
178
+ getAt(index = 0) {
179
+ if (index < 0 || index >= this.items.length) {
180
+ return null;
181
+ }
182
+ return this.items[index].item;
183
+ }
184
+ /**
185
+ * 获取指定范��的元素(可选参数)
186
+ */
187
+ getRange(start = 0, end) {
188
+ if (end === undefined) {
189
+ end = this.items.length;
190
+ }
191
+ return this.items.slice(start, end).map((entry) => entry.item);
192
+ }
193
+ /**
194
+ * 移除指定元素
195
+ */
196
+ remove(item) {
197
+ const index = this.items.findIndex((entry) => entry.item === item);
198
+ if (index >= 0) {
199
+ this.items.splice(index, 1);
200
+ return true;
201
+ }
202
+ return false;
203
+ }
204
+ /**
205
+ * 移除指定索引的元素(可选参数)
206
+ */
207
+ removeAt(index = 0) {
208
+ if (index < 0 || index >= this.items.length) {
209
+ return null;
210
+ }
211
+ const [removed] = this.items.splice(index, 1);
212
+ return removed.item;
213
+ }
214
+ /**
215
+ * 更新元素的优先级
216
+ */
217
+ updatePriority(item, newPriority = 0) {
218
+ const index = this.items.findIndex((entry) => entry.item === item);
219
+ if (index >= 0) {
220
+ // 先移除,再重新插入
221
+ this.items.splice(index, 1);
222
+ this.enqueue(item, newPriority);
223
+ return true;
224
+ }
225
+ return false;
226
+ }
227
+ /**
228
+ * 查找指定元素
229
+ */
230
+ find(predicate) {
231
+ const entry = this.items.find((entry) => predicate(entry.item));
232
+ return entry ? entry.item : null;
233
+ }
234
+ /**
235
+ * 查找所有符合条件的元素
236
+ */
237
+ findAll(predicate) {
238
+ return this.items
239
+ .filter((entry) => predicate(entry.item))
240
+ .map((entry) => entry.item);
241
+ }
242
+ /**
243
+ * 过滤元素
244
+ */
245
+ filter(predicate) {
246
+ return this.findAll(predicate);
247
+ }
248
+ /**
249
+ * 遍历元素
250
+ */
251
+ forEach(callback) {
252
+ this.items.forEach((entry, index) => {
253
+ callback(entry.item, entry.priority, index);
254
+ });
255
+ }
256
+ /**
257
+ * 映射元素
258
+ */
259
+ map(callback) {
260
+ return this.items.map((entry, index) => callback(entry.item, entry.priority, index));
261
+ }
262
+ /**
263
+ * 判断是否应该插入到指定元素之前
264
+ */
265
+ shouldInsertBefore(newItem, existingItem) {
266
+ // 首先比较优先级
267
+ if (this.heapType === HeapType.MAX_HEAP) {
268
+ // 大顶堆:优先级高的在前
269
+ if (newItem.priority > existingItem.priority)
270
+ return true;
271
+ if (newItem.priority < existingItem.priority)
272
+ return false;
273
+ }
274
+ else {
275
+ // 小顶堆:优先级低的在前
276
+ if (newItem.priority < existingItem.priority)
277
+ return true;
278
+ if (newItem.priority > existingItem.priority)
279
+ return false;
280
+ }
281
+ // 优先级相同时,根据排序策略决定
282
+ if (this.priorityOrder === PriorityOrder.FIFO) {
283
+ // 先入先出:时间戳小的在前(先入队的在前)
284
+ return newItem.timestamp < existingItem.timestamp;
285
+ }
286
+ else {
287
+ // 后入先出:时间戳大的在前(后入队的在前)
288
+ return newItem.timestamp > existingItem.timestamp;
289
+ }
290
+ }
291
+ /**
292
+ * 重新排序所有元素
293
+ */
294
+ resort() {
295
+ const items = [...this.items];
296
+ this.items = [];
297
+ // 按照新的堆类型和排序策略重新入队,保留原有时间戳
298
+ items.forEach((entry) => {
299
+ this.enqueue(entry.item, entry.priority, entry.timestamp);
300
+ });
301
+ }
302
+ /**
303
+ * 转换为数组
304
+ */
305
+ toArray() {
306
+ return this.getAll();
307
+ }
308
+ /**
309
+ * 转换为JSON字符串
310
+ */
311
+ toJSON() {
312
+ return JSON.stringify(this.getAllWithDetails());
313
+ }
314
+ /**
315
+ * 克隆队列
316
+ */
317
+ clone() {
318
+ const newQueue = new PriorityQueue(this.heapType, this.priorityOrder);
319
+ this.items.forEach((entry) => {
320
+ newQueue.enqueue(entry.item, entry.priority, entry.timestamp);
321
+ });
322
+ return newQueue;
323
+ }
324
+ }
325
+ exports.PriorityQueue = PriorityQueue;
@@ -0,0 +1,367 @@
1
+ /**
2
+ * 通用的优先级队列 - 支持泛型存储,可切换大顶堆/小顶堆模式
3
+ * 支持优先级相同时的排序策略:先入先出(FIFO)或后入先出(LIFO)
4
+ */
5
+ export enum HeapType {
6
+ MAX_HEAP = "max", // 大顶堆:优先级高的在前
7
+ MIN_HEAP = "min", // 小顶堆:优先级低的在前
8
+ }
9
+
10
+ export enum PriorityOrder {
11
+ FIFO = "fifo", // 先入先出:优先级相同时,先入队的在前
12
+ LIFO = "lifo", // 后入先出:优先级相同时,后入队的在前
13
+ }
14
+
15
+ export class PriorityQueue<T> {
16
+ private items: Array<{ item: T; priority: number; timestamp: number }> = [];
17
+ private heapType: HeapType;
18
+ private priorityOrder: PriorityOrder;
19
+
20
+ constructor(
21
+ heapType: HeapType = HeapType.MAX_HEAP,
22
+ priorityOrder: PriorityOrder = PriorityOrder.FIFO,
23
+ ) {
24
+ this.heapType = heapType;
25
+ this.priorityOrder = priorityOrder;
26
+ }
27
+
28
+ /**
29
+ * 设置堆类型(可选参数)
30
+ */
31
+ setHeapType(heapType?: HeapType): void {
32
+ if (heapType !== undefined && this.heapType !== heapType) {
33
+ this.heapType = heapType;
34
+ this.resort();
35
+ }
36
+ }
37
+
38
+ /**
39
+ * 获取当前堆类型
40
+ */
41
+ getHeapType(): HeapType {
42
+ return this.heapType;
43
+ }
44
+
45
+ /**
46
+ * 设置优先级相同时的排序策略(可选参数)
47
+ */
48
+ setPriorityOrder(order?: PriorityOrder): void {
49
+ if (order !== undefined && this.priorityOrder !== order) {
50
+ this.priorityOrder = order;
51
+ this.resort();
52
+ }
53
+ }
54
+
55
+ /**
56
+ * 获取当前优先级相同时的排序策略
57
+ */
58
+ getPriorityOrder(): PriorityOrder {
59
+ return this.priorityOrder;
60
+ }
61
+
62
+ /**
63
+ * 入队 - 按当前堆类型和排序策略排序
64
+ */
65
+ enqueue(item: T, priority: number = 0, timestamp?: number): void {
66
+ const newTimestamp = timestamp !== undefined ? timestamp : Date.now();
67
+
68
+ // 如果 item 已存在,移除旧项
69
+ const existingIndex = this.items.findIndex((entry) => entry.item === item);
70
+ if (existingIndex !== -1) {
71
+ this.items.splice(existingIndex, 1);
72
+ }
73
+
74
+ const newItem = {
75
+ item,
76
+ priority,
77
+ timestamp: newTimestamp,
78
+ };
79
+
80
+ // 根据堆类型和排序策略找到插入位置
81
+ let insertIndex = this.items.length;
82
+ for (let i = 0; i < this.items.length; i++) {
83
+ if (this.shouldInsertBefore(newItem, this.items[i])) {
84
+ insertIndex = i;
85
+ break;
86
+ }
87
+ }
88
+
89
+ this.items.splice(insertIndex, 0, newItem);
90
+ }
91
+
92
+ /**
93
+ * 批量入队(可选参数)
94
+ */
95
+ enqueueMultiple(items: T[], priority: number = 0): void {
96
+ items.forEach((item) => this.enqueue(item, priority));
97
+ }
98
+
99
+ /**
100
+ * 出队 - 返回队首元素(最高或最低优先级)
101
+ */
102
+ dequeue(): T | null {
103
+ if (this.isEmpty()) {
104
+ return null;
105
+ }
106
+ return this.items.shift()!.item;
107
+ }
108
+
109
+ /**
110
+ * 批量出队(可选参数)
111
+ */
112
+ dequeueMultiple(count?: number): T[] {
113
+ if (count === undefined) {
114
+ count = this.items.length;
115
+ }
116
+
117
+ const result: T[] = [];
118
+ for (let i = 0; i < count && !this.isEmpty(); i++) {
119
+ const item = this.dequeue();
120
+ if (item !== null) {
121
+ result.push(item);
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+
127
+ /**
128
+ * 查看队首元素(不移除)
129
+ */
130
+ peek(): T | null {
131
+ if (this.isEmpty()) {
132
+ return null;
133
+ }
134
+ return this.items[0].item;
135
+ }
136
+
137
+ /**
138
+ * 查看队首元素的优先级
139
+ */
140
+ peekPriority(): number | null {
141
+ if (this.isEmpty()) {
142
+ return null;
143
+ }
144
+ return this.items[0].priority;
145
+ }
146
+
147
+ /**
148
+ * 查看前N个元素(可选参数)
149
+ */
150
+ peekMultiple(count?: number): T[] {
151
+ if (count === undefined) {
152
+ count = this.items.length;
153
+ }
154
+
155
+ return this.items
156
+ .slice(0, Math.min(count, this.items.length))
157
+ .map((entry) => entry.item);
158
+ }
159
+
160
+ /**
161
+ * 队列是否为空
162
+ */
163
+ isEmpty(): boolean {
164
+ return this.items.length === 0;
165
+ }
166
+
167
+ /**
168
+ * 队列大小
169
+ */
170
+ size(): number {
171
+ return this.items.length;
172
+ }
173
+
174
+ /**
175
+ * 清空队列
176
+ */
177
+ clear(): void {
178
+ this.items = [];
179
+ }
180
+
181
+ /**
182
+ * 获取所有元素(按当前堆类型排序)
183
+ */
184
+ getAll(): T[] {
185
+ return this.items.map((entry) => entry.item);
186
+ }
187
+
188
+ /**
189
+ * 获取所有元素及其优先级
190
+ */
191
+ getAllWithPriority(): Array<{ item: T; priority: number }> {
192
+ return this.items.map(({ item, priority }) => ({ item, priority }));
193
+ }
194
+
195
+ /**
196
+ * 获取所有元素及其详细信息
197
+ */
198
+ getAllWithDetails(): Array<{ item: T; priority: number; timestamp: number }> {
199
+ return [...this.items];
200
+ }
201
+
202
+ /**
203
+ * 获取指定索引的元素(可选参数)
204
+ */
205
+ getAt(index: number = 0): T | null {
206
+ if (index < 0 || index >= this.items.length) {
207
+ return null;
208
+ }
209
+ return this.items[index].item;
210
+ }
211
+
212
+ /**
213
+ * 获取指定范��的元素(可选参数)
214
+ */
215
+ getRange(start: number = 0, end?: number): T[] {
216
+ if (end === undefined) {
217
+ end = this.items.length;
218
+ }
219
+
220
+ return this.items.slice(start, end).map((entry) => entry.item);
221
+ }
222
+
223
+ /**
224
+ * 移除指定元素
225
+ */
226
+ remove(item: T): boolean {
227
+ const index = this.items.findIndex((entry) => entry.item === item);
228
+ if (index >= 0) {
229
+ this.items.splice(index, 1);
230
+ return true;
231
+ }
232
+ return false;
233
+ }
234
+
235
+ /**
236
+ * 移除指定索引的元素(可选参数)
237
+ */
238
+ removeAt(index: number = 0): T | null {
239
+ if (index < 0 || index >= this.items.length) {
240
+ return null;
241
+ }
242
+ const [removed] = this.items.splice(index, 1);
243
+ return removed.item;
244
+ }
245
+
246
+ /**
247
+ * 更新元素的优先级
248
+ */
249
+ updatePriority(item: T, newPriority: number = 0): boolean {
250
+ const index = this.items.findIndex((entry) => entry.item === item);
251
+ if (index >= 0) {
252
+ // 先移除,再重新插入
253
+ this.items.splice(index, 1);
254
+ this.enqueue(item, newPriority);
255
+ return true;
256
+ }
257
+ return false;
258
+ }
259
+
260
+ /**
261
+ * 查找指定元素
262
+ */
263
+ find(predicate: (item: T) => boolean): T | null {
264
+ const entry = this.items.find((entry) => predicate(entry.item));
265
+ return entry ? entry.item : null;
266
+ }
267
+
268
+ /**
269
+ * 查找所有符合条件的元素
270
+ */
271
+ findAll(predicate: (item: T) => boolean): T[] {
272
+ return this.items
273
+ .filter((entry) => predicate(entry.item))
274
+ .map((entry) => entry.item);
275
+ }
276
+
277
+ /**
278
+ * 过滤元素
279
+ */
280
+ filter(predicate: (item: T) => boolean): T[] {
281
+ return this.findAll(predicate);
282
+ }
283
+
284
+ /**
285
+ * 遍历元素
286
+ */
287
+ forEach(callback: (item: T, priority: number, index: number) => void): void {
288
+ this.items.forEach((entry, index) => {
289
+ callback(entry.item, entry.priority, index);
290
+ });
291
+ }
292
+
293
+ /**
294
+ * 映射元素
295
+ */
296
+ map<U>(callback: (item: T, priority: number, index: number) => U): U[] {
297
+ return this.items.map((entry, index) =>
298
+ callback(entry.item, entry.priority, index),
299
+ );
300
+ }
301
+
302
+ /**
303
+ * 判断是否应该插入到指定元素之前
304
+ */
305
+ private shouldInsertBefore(
306
+ newItem: { item: T; priority: number; timestamp: number },
307
+ existingItem: { item: T; priority: number; timestamp: number },
308
+ ): boolean {
309
+ // 首先比较优先级
310
+ if (this.heapType === HeapType.MAX_HEAP) {
311
+ // 大顶堆:优先级高的在前
312
+ if (newItem.priority > existingItem.priority) return true;
313
+ if (newItem.priority < existingItem.priority) return false;
314
+ } else {
315
+ // 小顶堆:优先级低的在前
316
+ if (newItem.priority < existingItem.priority) return true;
317
+ if (newItem.priority > existingItem.priority) return false;
318
+ }
319
+
320
+ // 优先级相同时,根据排序策略决定
321
+ if (this.priorityOrder === PriorityOrder.FIFO) {
322
+ // 先入先出:时间戳小的在前(先入队的在前)
323
+ return newItem.timestamp < existingItem.timestamp;
324
+ } else {
325
+ // 后入先出:时间戳大的在前(后入队的在前)
326
+ return newItem.timestamp > existingItem.timestamp;
327
+ }
328
+ }
329
+
330
+ /**
331
+ * 重新排序所有元素
332
+ */
333
+ private resort(): void {
334
+ const items = [...this.items];
335
+ this.items = [];
336
+
337
+ // 按照新的堆类型和排序策略重新入队,保留原有时间戳
338
+ items.forEach((entry) => {
339
+ this.enqueue(entry.item, entry.priority, entry.timestamp);
340
+ });
341
+ }
342
+
343
+ /**
344
+ * 转换为数组
345
+ */
346
+ toArray(): T[] {
347
+ return this.getAll();
348
+ }
349
+
350
+ /**
351
+ * 转换为JSON字符串
352
+ */
353
+ toJSON(): string {
354
+ return JSON.stringify(this.getAllWithDetails());
355
+ }
356
+
357
+ /**
358
+ * 克隆队列
359
+ */
360
+ clone(): PriorityQueue<T> {
361
+ const newQueue = new PriorityQueue<T>(this.heapType, this.priorityOrder);
362
+ this.items.forEach((entry) => {
363
+ newQueue.enqueue(entry.item, entry.priority, entry.timestamp);
364
+ });
365
+ return newQueue;
366
+ }
367
+ }