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