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