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<T>) => 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<T> | 否 | 当前调用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<T> 375 376返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。 377 378**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 379 380**系统能力:** SystemCapability.Utils.Lang 381 382**返回值:** 383 384| 类型 | 说明 | 385| -------- | -------- | 386| IterableIterator<T> | 返回一个迭代器。 | 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```