js-apis-deque.md 8.8 KB
Newer Older
1
# @ohos.util.Deque (线性容器Deque)
L
linhaoran 已提交
2 3 4 5

> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

6 7 8 9 10 11 12
Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。

Deque和[Queue](js-apis-queue.md)相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。

[Vector](js-apis-vector.md)相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。

**推荐使用场景:** 需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。
L
linhaoran 已提交
13

L
lengchangjing 已提交
14 15 16
文档中存在泛型的使用,涉及以下泛型标记符:<br>
- T: Type, 类

L
linhaoran 已提交
17 18
## 导入模块

19
```ts
20
import Deque from '@ohos.util.Deque'; 
L
linhaoran 已提交
21 22 23 24 25 26
```

## Deque

### 属性

Z
zengyawen 已提交
27 28
**系统能力:** SystemCapability.Utils.Lang

L
liu-ganlin 已提交
29
| 名称 | 类型 | 可读 | 可写 | 说明 |
L
linhaoran 已提交
30
| -------- | -------- | -------- | -------- | -------- |
Z
zengyawen 已提交
31
| length | number | 是 | 否 | Deque的元素个数。 |
L
linhaoran 已提交
32 33 34

### constructor

Z
zengyawen 已提交
35
constructor()
L
linhaoran 已提交
36 37 38

Deque的构造函数。

Z
zengyawen 已提交
39 40
**系统能力:** SystemCapability.Utils.Lang

L
liu-ganlin 已提交
41 42
**错误码:**

B
bi-hu 已提交
43
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
44

L
liu-ganlin 已提交
45
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
46 47 48
| -------- | -------- |
| 10200012 | The Deque's constructor cannot be directly invoked. |

Z
zengyawen 已提交
49 50
**示例:**

51
```ts
Z
zengyawen 已提交
52 53
let deque = new Deque();
```
L
linhaoran 已提交
54 55 56

### insertFront

Z
zengyawen 已提交
57
insertFront(element: T): void
L
linhaoran 已提交
58 59 60

在deque头部插入元素。

Z
zengyawen 已提交
61 62
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
63 64 65 66 67 68
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| element | T | 是 | 插入的元素。 |

L
liu-ganlin 已提交
69 70
**错误码:**

B
bi-hu 已提交
71
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
72

L
liu-ganlin 已提交
73
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
74 75 76
| -------- | -------- |
| 10200011 | The insertFront method cannot be bound. |

Z
zengyawen 已提交
77 78
**示例:**

79
```ts
80
let deque = new Deque();
Z
zengyawen 已提交
81 82 83 84
deque.insertFront("a");
deque.insertFront(1);
let b = [1, 2, 3];
deque.insertFront(b);
L
lengchangjing 已提交
85
let c = {name : "Dylon", age : "13"};
L
liu-ganlin 已提交
86
deque.insertFront(c);
Z
zengyawen 已提交
87 88 89
deque.insertFront(false);
```

L
linhaoran 已提交
90 91
### insertEnd

Z
zengyawen 已提交
92
insertEnd(element: T): void
L
linhaoran 已提交
93 94 95

在deque尾部插入元素。

Z
zengyawen 已提交
96 97
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
98 99 100 101 102 103
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| element | T | 是 | 插入的元素。 |

L
liu-ganlin 已提交
104 105
**错误码:**

B
bi-hu 已提交
106
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
107

L
liu-ganlin 已提交
108
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
109 110 111
| -------- | -------- |
| 10200011 | The insertEnd method cannot be bound. |

Z
zengyawen 已提交
112 113
**示例:**

114
```ts
115
let deque = new Deque();
Z
zengyawen 已提交
116 117 118 119
deque.insertEnd("a");
deque.insertEnd(1);
let b = [1, 2, 3];
deque.insertEnd(b);
L
lengchangjing 已提交
120
let c = {name : "Dylon", age : "13"};
L
liu-ganlin 已提交
121
deque.insertEnd(c);
Z
zengyawen 已提交
122 123 124
deque.insertEnd(false);
```

L
linhaoran 已提交
125 126
### has

Z
zengyawen 已提交
127
has(element: T): boolean
L
linhaoran 已提交
128 129 130

判断此Deque中是否含有该指定元素。

Z
zengyawen 已提交
131 132
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
133 134 135 136 137 138 139 140 141 142 143 144
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| element | T | 是 | 指定的元素。 |

**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| boolean | 如果包含指定元素返回true,否则返回false。 |

L
liu-ganlin 已提交
145 146
**错误码:**

B
bi-hu 已提交
147
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
148

L
liu-ganlin 已提交
149
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
150 151 152
| -------- | -------- |
| 10200011 | The has method cannot be bound. |

Z
zengyawen 已提交
153 154
**示例:**

155
```ts
Z
zengyawen 已提交
156
let deque = new Deque();
L
lengchangjing 已提交
157 158 159
let result = deque.has("squirrel");
deque.insertFront("squirrel");
let result1 = deque.has("squirrel");
Z
zengyawen 已提交
160 161
```

L
linhaoran 已提交
162 163
### popFirst

Z
zengyawen 已提交
164
popFirst(): T
L
linhaoran 已提交
165 166 167

删除并返回双端队列的首元素。

Z
zengyawen 已提交
168 169
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
170 171 172 173 174 175
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回被删除的元素。 |

L
liu-ganlin 已提交
176 177
**错误码:**

B
bi-hu 已提交
178
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
179

L
liu-ganlin 已提交
180
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
181 182 183
| -------- | -------- |
| 10200011 | The popFirst method cannot be bound. |

Z
zengyawen 已提交
184 185
**示例:**

186
```ts
Z
zengyawen 已提交
187 188 189 190 191 192
let deque = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertEnd(5);
deque.insertFront(2);
deque.insertFront(4);
193
let result = deque.popFirst();
Z
zengyawen 已提交
194 195
```

L
linhaoran 已提交
196 197
### popLast

Z
zengyawen 已提交
198
popLast(): T
L
linhaoran 已提交
199 200 201

删除并返回双端队列的尾元素。

Z
zengyawen 已提交
202 203
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
204 205 206 207 208 209
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回被删除的元素。 |

L
liu-ganlin 已提交
210 211
**错误码:**

B
bi-hu 已提交
212
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
213

L
liu-ganlin 已提交
214
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
215 216 217
| -------- | -------- |
| 10200011 | The popLast method cannot be bound. |

Z
zengyawen 已提交
218 219
**示例:**

220
```ts
Z
zengyawen 已提交
221 222 223 224 225 226
let deque = new Deque();
deque.insertFront(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertFront(2);
deque.insertFront(4);
227
let result = deque.popLast();
Z
zengyawen 已提交
228
```
L
linhaoran 已提交
229 230

### forEach
231

232
forEach(callbackFn: (value: T, index?: number, deque?: Deque&lt;T&gt;) => void,
Z
zengyawen 已提交
233
thisArg?: Object): void
L
linhaoran 已提交
234 235 236

通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。

Z
zengyawen 已提交
237 238
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
239 240 241 242
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
243
| callbackFn | function | 是 | 回调函数。 |
Z
zengyawen 已提交
244 245 246 247 248 249 250 251 252 253
| thisArg | Object | 否 | callbackfn被调用时用作this值。 |

callbackfn的参数说明:

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 当前遍历到的元素。 |
| index | number | 否 | 当前遍历到的下标值。 |
| deque | Deque&lt;T&gt; | 否 | 当前调用forEach方法的实例对象。 |

L
liu-ganlin 已提交
254 255
**错误码:**

B
bi-hu 已提交
256
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
257

L
liu-ganlin 已提交
258
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
259 260 261
| -------- | -------- |
| 10200011 | The forEach method cannot be bound. |

Z
zengyawen 已提交
262 263
**示例:**

264
```ts
Z
zengyawen 已提交
265 266 267 268 269 270
let deque = new Deque();
deque.insertFront(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertEnd(4);
deque.forEach((value, index) => {
271
  console.log("value:" + value, index);
Z
zengyawen 已提交
272 273
});
```
L
linhaoran 已提交
274 275 276

### getFirst

277
getFirst(): T
W
wusongqing 已提交
278

L
linhaoran 已提交
279 280
获取Deque实例中的头元素。

Z
zengyawen 已提交
281 282
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
283 284 285 286 287 288
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回T型 |

L
liu-ganlin 已提交
289 290
**错误码:**

B
bi-hu 已提交
291
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
292

L
liu-ganlin 已提交
293
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
294 295 296
| -------- | -------- |
| 10200011 | The getFirst method cannot be bound. |

Z
zengyawen 已提交
297 298
**示例:**

299
```ts
Z
zengyawen 已提交
300 301 302 303 304
let deque = new Deque();
deque.insertEnd(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertFront(4);
305
let result = deque.getFirst();
Z
zengyawen 已提交
306 307
```

L
linhaoran 已提交
308 309
### getLast

Z
zengyawen 已提交
310
getLast(): T
W
wusongqing 已提交
311

L
linhaoran 已提交
312 313
获取Deque实例中的尾元素。

Z
zengyawen 已提交
314 315
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
316 317 318 319 320
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回T型 |
L
linhaoran 已提交
321

L
liu-ganlin 已提交
322 323
**错误码:**

B
bi-hu 已提交
324
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
325

L
liu-ganlin 已提交
326
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
327 328 329
| -------- | -------- |
| 10200011 | The getLast method cannot be bound. |

Z
zengyawen 已提交
330
**示例:**
L
linhaoran 已提交
331

332
```ts
Z
zengyawen 已提交
333 334 335 336 337
let deque = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertFront(5);
deque.insertFront(4);
338
let result = deque.getLast();
Z
zengyawen 已提交
339
```
L
linhaoran 已提交
340 341 342

### [Symbol.iterator]

Z
zengyawen 已提交
343
[Symbol.iterator]\(): IterableIterator&lt;T&gt;
L
linhaoran 已提交
344 345 346

返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。

Z
zengyawen 已提交
347 348
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
349 350 351 352 353
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| IterableIterator&lt;T&gt; | 返回一个迭代器。 |
L
linhaoran 已提交
354

L
liu-ganlin 已提交
355 356
**错误码:**

B
bi-hu 已提交
357
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
358

L
liu-ganlin 已提交
359
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
360 361 362
| -------- | -------- |
| 10200011 | The Symbol.iterator method cannot be bound. |

Z
zengyawen 已提交
363
**示例:**
364
```ts
Z
zengyawen 已提交
365 366 367 368 369 370 371 372
let deque = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertFront(5);
deque.insertFront(4);

// 使用方法一:
for (let item of deque) { 
373
  console.log("value:" + item); 
Z
zengyawen 已提交
374 375 376 377 378 379
}

// 使用方法二:
let iter = deque[Symbol.iterator]();
let temp = iter.next().value;
while(temp != undefined) {
380
  console.log("value:" + temp);
Z
zengyawen 已提交
381 382 383
  temp = iter.next().value;
}
```