• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.util.Deque (线性容器Deque)
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @xliu-huanwei; @shilei123; @huanghello-->
5<!--Designer: @yuanyao14-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9Deque(double ended queue)基于循环队列的数据结构实现,支持两端元素的插入和删除,同时具备先进先出以及先进后出的特点。Deque会根据实际需要动态调整容量,每次扩容两倍。
10
11Deque和[Queue](js-apis-queue.md)相比,Deque允许在两端执行插入和删除操作,Queue只能在头部删除元素,尾部插入元素。
12
13与[ArrayList](js-apis-arraylist.md)相比,它们都支持在两端插入和删除元素,但Deque不支持中间插入。Deque在头部插入删除元素的效率高于ArrayList,而ArrayList随机访问元素的效率高于Deque。
14
15**推荐使用场景:** 需要在集合两端频繁增删元素时,推荐使用Deque。
16
17文档中使用了泛型,涉及以下泛型标记符:
18- T:Type,类
19
20> **说明:**
21>
22> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
23>
24> 容器类使用静态语言实现,限制了存储位置和属性,不支持自定义属性和方法。
25
26
27## 导入模块
28
29```ts
30import { Deque } from '@kit.ArkTS';
31```
32
33## Deque
34
35### 属性
36
37**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
38
39**系统能力:** SystemCapability.Utils.Lang
40
41| 名称 | 类型 | 只读 | 可选 | 说明 |
42| -------- | -------- | -------- | -------- | -------- |
43| length | number | 是 | 否 | Deque的元素个数。 |
44
45### constructor
46
47constructor()
48
49Deque的构造函数。
50
51**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
52
53**系统能力:** SystemCapability.Utils.Lang
54
55**错误码:**
56
57以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
58
59| 错误码ID | 错误信息 |
60| -------- | -------- |
61| 10200012 | The Deque's constructor cannot be directly invoked. |
62
63**示例:**
64
65```ts
66let deque = new Deque<string | number | boolean | Object>();
67```
68
69### insertFront
70
71insertFront(element: T): void
72
73在deque头部插入元素。
74
75**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
76
77**系统能力:** SystemCapability.Utils.Lang
78
79**参数:**
80
81| 参数名 | 类型 | 必填 | 说明 |
82| -------- | -------- | -------- | -------- |
83| element | T | 是 | 插入的元素。 |
84
85**错误码:**
86
87以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
88
89| 错误码ID | 错误信息 |
90| -------- | -------- |
91| 10200011 | The insertFront method cannot be bound. |
92
93**示例:**
94
95```ts
96class C1 {
97  name: string = ""
98  age: string = ""
99}
100
101let deque = new Deque<string | number | boolean | Array<number> | C1>();
102deque.insertFront("a");
103deque.insertFront(1);
104let b = [1, 2, 3];
105deque.insertFront(b);
106let c: C1 = {name : "Dylan", age : "13"};
107deque.insertFront(c);
108deque.insertFront(false);
109console.info("result:", deque[0]);  // result: false
110```
111
112### insertEnd
113
114insertEnd(element: T): void
115
116在deque尾部插入元素。
117
118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.Utils.Lang
121
122**参数:**
123
124| 参数名 | 类型 | 必填 | 说明 |
125| -------- | -------- | -------- | -------- |
126| element | T | 是 | 插入的元素。 |
127
128**错误码:**
129
130以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
131
132| 错误码ID | 错误信息 |
133| -------- | -------- |
134| 10200011 | The insertEnd method cannot be bound. |
135
136**示例:**
137
138```ts
139class C1 {
140  name: string = ""
141  age: string = ""
142}
143
144let deque = new Deque<string | number | boolean | Array<number> | C1>();
145deque.insertEnd("a");
146deque.insertEnd(1);
147let b = [1, 2, 3];
148deque.insertEnd(b);
149let c: C1 = {name : "Dylan", age : "13"};
150deque.insertEnd(c);
151deque.insertEnd(false);
152console.info("result:", deque[0]);  // result: a
153```
154
155### has
156
157has(element: T): boolean
158
159判断此Deque中是否包含指定元素。
160
161**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
162
163**系统能力:** SystemCapability.Utils.Lang
164
165**参数:**
166
167| 参数名 | 类型 | 必填 | 说明 |
168| -------- | -------- | -------- | -------- |
169| element | T | 是 | 指定的元素。 |
170
171**返回值:**
172
173| 类型 | 说明 |
174| -------- | -------- |
175| boolean | 如果包含指定元素返回true,否则返回false。 |
176
177**错误码:**
178
179以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
180
181| 错误码ID | 错误信息 |
182| -------- | -------- |
183| 10200011 | The has method cannot be bound. |
184
185**示例:**
186
187```ts
188let deque = new Deque<string>();
189deque.insertFront("squirrel");
190let result = deque.has("squirrel");
191console.info("result:", result);  // result: true
192```
193
194### popFirst
195
196popFirst(): T
197
198删除并返回双端队列的首元素。
199
200**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
201
202**系统能力:** SystemCapability.Utils.Lang
203
204**返回值:**
205
206| 类型 | 说明 |
207| -------- | -------- |
208| T | 返回被删除的首元素。 |
209
210**错误码:**
211
212以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
213
214| 错误码ID | 错误信息 |
215| -------- | -------- |
216| 10200011 | The popFirst method cannot be bound. |
217
218**示例:**
219
220```ts
221let deque = new Deque<number>();
222deque.insertFront(2);
223deque.insertFront(4);
224deque.insertEnd(5);
225deque.insertFront(2);
226deque.insertFront(4);
227let result = deque.popFirst();
228console.info("result:", result);  // result: 4
229```
230
231### popLast
232
233popLast(): T
234
235删除并返回双端队列的尾元素。
236
237**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
238
239**系统能力:** SystemCapability.Utils.Lang
240
241**返回值:**
242
243| 类型 | 说明 |
244| -------- | -------- |
245| T | 返回被删除的尾元素。 |
246
247**错误码:**
248
249以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
250
251| 错误码ID | 错误信息 |
252| -------- | -------- |
253| 10200011 | The popLast method cannot be bound. |
254
255**示例:**
256
257```ts
258let deque = new Deque<number>();
259deque.insertFront(2);
260deque.insertEnd(6);
261deque.insertFront(5);
262deque.insertFront(2);
263deque.insertFront(4);
264let result = deque.popLast();
265console.info("result:", result);  // result: 6
266```
267
268### forEach
269
270forEach(callbackFn: (value: T, index?: number, deque?: Deque&lt;T&gt;) => void,
271thisArg?: Object): void
272
273在遍历Deque实例对象中每一个元素的过程中,对每个元素执行回调函数。
274
275**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
276
277**系统能力:** SystemCapability.Utils.Lang
278
279**参数:**
280
281| 参数名 | 类型 | 必填 | 说明 |
282| -------- | -------- | -------- | -------- |
283| callbackFn | function | 是 | 回调函数。 |
284| thisArg | Object | 否 | callbackFn被调用时用作this值,默认值为当前实例对象。 |
285
286callbackFn的参数说明:
287
288| 参数名 | 类型 | 必填 | 说明 |
289| -------- | -------- | -------- | -------- |
290| value | T | 是 | 当前遍历到的元素。 |
291| index | number | 否 | 当前遍历到的下标值,默认值为0。 |
292| deque | Deque&lt;T&gt; | 否 | 当前调用forEach方法的实例对象,默认值为当前实例对象。 |
293
294**错误码:**
295
296以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
297
298| 错误码ID | 错误信息 |
299| -------- | -------- |
300| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. |
301| 10200011 | The forEach method cannot be bound. |
302
303**示例:**
304
305```ts
306let deque = new Deque<number>();
307deque.insertFront(2);
308deque.insertEnd(3);
309deque.insertFront(1);
310deque.insertEnd(4);
311deque.forEach((value: number, index: number): void => {
312  console.info("value:" + value, "index:" + index);
313});
314/*
315输出结果:value:1 index:0
316        value:2 index:1
317        value:3 index:2
318        value:4 index:3
319*/
320```
321
322### getFirst
323
324getFirst(): T
325
326获取Deque实例的头元素。
327
328**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
329
330**系统能力:** SystemCapability.Utils.Lang
331
332**返回值:**
333
334| 类型 | 说明 |
335| -------- | -------- |
336| T | 返回T类型的头元素。 |
337
338**错误码:**
339
340以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
341
342| 错误码ID | 错误信息 |
343| -------- | -------- |
344| 10200011 | The getFirst method cannot be bound. |
345
346**示例:**
347
348```ts
349let deque = new Deque<number>();
350deque.insertEnd(2);
351deque.insertEnd(4);
352deque.insertFront(5);
353deque.insertFront(4);
354let result = deque.getFirst();
355console.info("result:", result);  // result: 4
356```
357
358### getLast
359
360getLast(): T
361
362获取Deque实例的尾元素。
363
364**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
365
366**系统能力:** SystemCapability.Utils.Lang
367
368**返回值:**
369
370| 类型 | 说明 |
371| -------- | -------- |
372| T | 返回T类型的尾元素。 |
373
374**错误码:**
375
376以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
377
378| 错误码ID | 错误信息 |
379| -------- | -------- |
380| 10200011 | The getLast method cannot be bound. |
381
382**示例:**
383
384```ts
385let deque = new Deque<number>();
386deque.insertFront(2);
387deque.insertFront(4);
388deque.insertFront(5);
389deque.insertFront(4);
390let result = deque.getLast();
391console.info("result:", result);  // result: 2
392```
393
394### [Symbol.iterator]
395
396[Symbol.iterator]\(): IterableIterator&lt;T&gt;
397
398返回一个迭代器,迭代器的每一项都是一个JavaScript对象。
399
400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
401
402**系统能力:** SystemCapability.Utils.Lang
403
404**返回值:**
405
406| 类型 | 说明 |
407| -------- | -------- |
408| IterableIterator&lt;T&gt; | 返回一个迭代器。 |
409
410**错误码:**
411
412以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
413
414| 错误码ID | 错误信息 |
415| -------- | -------- |
416| 10200011 | The Symbol.iterator method cannot be bound. |
417
418**示例:**
419```ts
420let deque = new Deque<number>();
421deque.insertFront(2);
422deque.insertFront(4);
423deque.insertFront(5);
424deque.insertFront(4);
425
426// 使用方法一:
427for (let item of deque) {
428  console.info("value:" + item);
429}
430/*
431输出结果:4
432        5
433        4
434        2
435*/
436
437// 使用方法二:
438let iter = deque[Symbol.iterator]();
439let temp:IteratorResult<number> = iter.next();
440while(!temp.done) {
441  console.info("value:" + temp.value);
442  temp = iter.next();
443}
444/*
445输出结果:4
446        5
447        4
448        2
449*/
450```