• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 线性容器Deque
2
3> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
4> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
5
6Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。
7
8Deque和[Queue](js-apis-queue.md)相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。
9
10与[Vector](js-apis-vector.md)相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。
11
12**推荐使用场景:** 需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。
13
14## 导入模块
15
16```ts
17import Deque from '@ohos.util.Deque';
18```
19
20## Deque
21
22### 属性
23
24**系统能力:** SystemCapability.Utils.Lang
25
26| 名称 | 参数类型 | 可读 | 可写 | 说明 |
27| -------- | -------- | -------- | -------- | -------- |
28| length | number | 是 | 否 | Deque的元素个数。 |
29
30### constructor
31
32constructor()
33
34Deque的构造函数。
35
36**系统能力:** SystemCapability.Utils.Lang
37
38**示例:**
39
40```ts
41let deque = new Deque();
42```
43
44### insertFront
45
46insertFront(element: T): void
47
48在deque头部插入元素。
49
50**系统能力:** SystemCapability.Utils.Lang
51
52**参数:**
53
54| 参数名 | 类型 | 必填 | 说明 |
55| -------- | -------- | -------- | -------- |
56| element | T | 是 | 插入的元素。 |
57
58**示例:**
59
60```ts
61let deque = new Deque();
62deque.insertFront("a");
63deque.insertFront(1);
64let b = [1, 2, 3];
65deque.insertFront(b);
66let c = {name : "lala", age : "13"};
67deque.insertFront(false);
68```
69
70### insertEnd
71
72insertEnd(element: T): void
73
74在deque尾部插入元素。
75
76**系统能力:** SystemCapability.Utils.Lang
77
78**参数:**
79
80| 参数名 | 类型 | 必填 | 说明 |
81| -------- | -------- | -------- | -------- |
82| element | T | 是 | 插入的元素。 |
83
84**示例:**
85
86```ts
87let deque = new Deque();
88deque.insertEnd("a");
89deque.insertEnd(1);
90let b = [1, 2, 3];
91deque.insertEnd(b);
92let c = {name : "lala", age : "13"};
93deque.insertEnd(false);
94```
95
96### has
97
98has(element: T): boolean
99
100判断此Deque中是否含有该指定元素。
101
102**系统能力:** SystemCapability.Utils.Lang
103
104**参数:**
105
106| 参数名 | 类型 | 必填 | 说明 |
107| -------- | -------- | -------- | -------- |
108| element | T | 是 | 指定的元素。 |
109
110**返回值:**
111
112| 类型 | 说明 |
113| -------- | -------- |
114| boolean | 如果包含指定元素返回true,否则返回false。 |
115
116**示例:**
117
118```ts
119let deque = new Deque();
120let result = deque.has("Ahfbrgrbgnutfodgorrogorg");
121deque.insertFront("Ahfbrgrbgnutfodgorrogorg");
122let result1 = deque.has("Ahfbrgrbgnutfodgorrogorg");
123```
124
125### popFirst
126
127popFirst(): T
128
129删除并返回双端队列的首元素。
130
131**系统能力:** SystemCapability.Utils.Lang
132
133**返回值:**
134
135| 类型 | 说明 |
136| -------- | -------- |
137| T | 返回被删除的元素。 |
138
139**示例:**
140
141```ts
142let deque = new Deque();
143deque.insertFront(2);
144deque.insertFront(4);
145deque.insertEnd(5);
146deque.insertFront(2);
147deque.insertFront(4);
148let result = deque.popFirst();
149```
150
151### popLast
152
153popLast(): T
154
155删除并返回双端队列的尾元素。
156
157**系统能力:** SystemCapability.Utils.Lang
158
159**返回值:**
160
161| 类型 | 说明 |
162| -------- | -------- |
163| T | 返回被删除的元素。 |
164
165**示例:**
166
167```ts
168let deque = new Deque();
169deque.insertFront(2);
170deque.insertEnd(4);
171deque.insertFront(5);
172deque.insertFront(2);
173deque.insertFront(4);
174let result = deque.popLast();
175```
176
177### forEach
178
179forEach(callbackfn: (value: T, index?: number, deque?: Deque<T>) => void,
180thisArg?: Object): void
181
182通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。
183
184**系统能力:** SystemCapability.Utils.Lang
185
186**参数:**
187
188| 参数名 | 类型 | 必填 | 说明 |
189| -------- | -------- | -------- | -------- |
190| callbackfn | function | 是 | 回调函数。 |
191| thisArg | Object | 否 | callbackfn被调用时用作this值。 |
192
193callbackfn的参数说明:
194
195| 参数名 | 类型 | 必填 | 说明 |
196| -------- | -------- | -------- | -------- |
197| value | T | 是 | 当前遍历到的元素。 |
198| index | number | 否 | 当前遍历到的下标值。 |
199| deque | Deque<T> | 否 | 当前调用forEach方法的实例对象。 |
200
201**示例:**
202
203```ts
204let deque = new Deque();
205deque.insertFront(2);
206deque.insertEnd(4);
207deque.insertFront(5);
208deque.insertEnd(4);
209deque.forEach((value, index) => {
210    console.log("value:" + value, "index:" + index);
211});
212```
213
214### getFirst
215
216getFirst(): T
217
218获取Deque实例中的头元素。
219
220**系统能力:** SystemCapability.Utils.Lang
221
222**返回值:**
223
224| 类型 | 说明 |
225| -------- | -------- |
226| T | 返回T型 |
227
228**示例:**
229
230```ts
231let deque = new Deque();
232deque.insertEnd(2);
233deque.insertEnd(4);
234deque.insertFront(5);
235deque.insertFront(4);
236let result = deque.getFirst();
237```
238
239### getLast
240
241getLast(): T
242
243获取Deque实例中的尾元素。
244
245**系统能力:** SystemCapability.Utils.Lang
246
247**返回值:**
248
249| 类型 | 说明 |
250| -------- | -------- |
251| T | 返回T型 |
252
253**示例:**
254
255```ts
256let deque = new Deque();
257deque.insertFront(2);
258deque.insertFront(4);
259deque.insertFront(5);
260deque.insertFront(4);
261let result = deque.getLast();
262```
263
264### [Symbol.iterator]
265
266[Symbol.iterator]\(): IterableIterator<T>
267
268返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。
269
270**系统能力:** SystemCapability.Utils.Lang
271
272**返回值:**
273
274| 类型 | 说明 |
275| -------- | -------- |
276| IterableIterator<T> | 返回一个迭代器。 |
277
278**示例:**
279```ts
280let deque = new Deque();
281deque.insertFront(2);
282deque.insertFront(4);
283deque.insertFront(5);
284deque.insertFront(4);
285
286// 使用方法一:
287for (let item of deque) {
288  console.log("value:" + item);
289}
290
291// 使用方法二:
292let iter = deque[Symbol.iterator]();
293let temp = iter.next().value;
294while(temp != undefined) {
295  console.log("value:" + temp);
296  temp = iter.next().value;
297}
298```