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<T>) => 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<T> | 否 | 当前调用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<T> 397 398返回一个迭代器,迭代器的每一项都是一个JavaScript对象。 399 400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 401 402**系统能力:** SystemCapability.Utils.Lang 403 404**返回值:** 405 406| 类型 | 说明 | 407| -------- | -------- | 408| IterableIterator<T> | 返回一个迭代器。 | 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```