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 = 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 82let deque = new Deque(); 83deque.insertFront("a"); 84deque.insertFront(1); 85let b = [1, 2, 3]; 86deque.insertFront(b); 87let c = {name : "Dylon", age : "13"}; 88deque.insertFront(c); 89deque.insertFront(false); 90``` 91 92### insertEnd 93 94insertEnd(element: T): void 95 96在deque尾部插入元素。 97 98**系统能力:** SystemCapability.Utils.Lang 99 100**参数:** 101 102| 参数名 | 类型 | 必填 | 说明 | 103| -------- | -------- | -------- | -------- | 104| element | T | 是 | 插入的元素。 | 105 106**错误码:** 107 108以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 109 110| 错误码ID | 错误信息 | 111| -------- | -------- | 112| 10200011 | The insertEnd method cannot be bound. | 113 114**示例:** 115 116```ts 117let deque = new Deque(); 118deque.insertEnd("a"); 119deque.insertEnd(1); 120let b = [1, 2, 3]; 121deque.insertEnd(b); 122let c = {name : "Dylon", age : "13"}; 123deque.insertEnd(c); 124deque.insertEnd(false); 125``` 126 127### has 128 129has(element: T): boolean 130 131判断此Deque中是否含有该指定元素。 132 133**系统能力:** SystemCapability.Utils.Lang 134 135**参数:** 136 137| 参数名 | 类型 | 必填 | 说明 | 138| -------- | -------- | -------- | -------- | 139| element | T | 是 | 指定的元素。 | 140 141**返回值:** 142 143| 类型 | 说明 | 144| -------- | -------- | 145| boolean | 如果包含指定元素返回true,否则返回false。 | 146 147**错误码:** 148 149以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 150 151| 错误码ID | 错误信息 | 152| -------- | -------- | 153| 10200011 | The has method cannot be bound. | 154 155**示例:** 156 157```ts 158let deque = new Deque(); 159let result = deque.has("squirrel"); 160deque.insertFront("squirrel"); 161let result1 = deque.has("squirrel"); 162``` 163 164### popFirst 165 166popFirst(): T 167 168删除并返回双端队列的首元素。 169 170**系统能力:** SystemCapability.Utils.Lang 171 172**返回值:** 173 174| 类型 | 说明 | 175| -------- | -------- | 176| T | 返回被删除的首元素。 | 177 178**错误码:** 179 180以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 181 182| 错误码ID | 错误信息 | 183| -------- | -------- | 184| 10200011 | The popFirst method cannot be bound. | 185 186**示例:** 187 188```ts 189let deque = new Deque(); 190deque.insertFront(2); 191deque.insertFront(4); 192deque.insertEnd(5); 193deque.insertFront(2); 194deque.insertFront(4); 195let result = deque.popFirst(); 196``` 197 198### popLast 199 200popLast(): T 201 202删除并返回双端队列的尾元素。 203 204**系统能力:** SystemCapability.Utils.Lang 205 206**返回值:** 207 208| 类型 | 说明 | 209| -------- | -------- | 210| T | 返回被删除的尾元素。 | 211 212**错误码:** 213 214以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 215 216| 错误码ID | 错误信息 | 217| -------- | -------- | 218| 10200011 | The popLast method cannot be bound. | 219 220**示例:** 221 222```ts 223let deque = new Deque(); 224deque.insertFront(2); 225deque.insertEnd(4); 226deque.insertFront(5); 227deque.insertFront(2); 228deque.insertFront(4); 229let result = deque.popLast(); 230``` 231 232### forEach 233 234forEach(callbackFn: (value: T, index?: number, deque?: Deque<T>) => void, 235thisArg?: Object): void 236 237通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。 238 239**系统能力:** SystemCapability.Utils.Lang 240 241**参数:** 242 243| 参数名 | 类型 | 必填 | 说明 | 244| -------- | -------- | -------- | -------- | 245| callbackFn | function | 是 | 回调函数。 | 246| thisArg | Object | 否 | callbackfn被调用时用作this值。 | 247 248callbackfn的参数说明: 249 250| 参数名 | 类型 | 必填 | 说明 | 251| -------- | -------- | -------- | -------- | 252| value | T | 是 | 当前遍历到的元素。 | 253| index | number | 否 | 当前遍历到的下标值。 | 254| deque | Deque<T> | 否 | 当前调用forEach方法的实例对象。 | 255 256**错误码:** 257 258以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 259 260| 错误码ID | 错误信息 | 261| -------- | -------- | 262| 10200011 | The forEach method cannot be bound. | 263 264**示例:** 265 266```ts 267let deque = new Deque(); 268deque.insertFront(2); 269deque.insertEnd(4); 270deque.insertFront(5); 271deque.insertEnd(4); 272deque.forEach((value, index) => { 273 console.log("value:" + value, "index:" + index); 274}); 275``` 276 277### getFirst 278 279getFirst(): T 280 281获取Deque实例中的头元素。 282 283**系统能力:** SystemCapability.Utils.Lang 284 285**返回值:** 286 287| 类型 | 说明 | 288| -------- | -------- | 289| T | 返回T型 | 290 291**错误码:** 292 293以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 294 295| 错误码ID | 错误信息 | 296| -------- | -------- | 297| 10200011 | The getFirst method cannot be bound. | 298 299**示例:** 300 301```ts 302let deque = new Deque(); 303deque.insertEnd(2); 304deque.insertEnd(4); 305deque.insertFront(5); 306deque.insertFront(4); 307let result = deque.getFirst(); 308``` 309 310### getLast 311 312getLast(): T 313 314获取Deque实例中的尾元素。 315 316**系统能力:** SystemCapability.Utils.Lang 317 318**返回值:** 319 320| 类型 | 说明 | 321| -------- | -------- | 322| T | 返回T型 | 323 324**错误码:** 325 326以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 327 328| 错误码ID | 错误信息 | 329| -------- | -------- | 330| 10200011 | The getLast method cannot be bound. | 331 332**示例:** 333 334```ts 335let deque = new Deque(); 336deque.insertFront(2); 337deque.insertFront(4); 338deque.insertFront(5); 339deque.insertFront(4); 340let result = deque.getLast(); 341``` 342 343### [Symbol.iterator] 344 345[Symbol.iterator]\(): IterableIterator<T> 346 347返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。 348 349**系统能力:** SystemCapability.Utils.Lang 350 351**返回值:** 352 353| 类型 | 说明 | 354| -------- | -------- | 355| IterableIterator<T> | 返回一个迭代器。 | 356 357**错误码:** 358 359以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 360 361| 错误码ID | 错误信息 | 362| -------- | -------- | 363| 10200011 | The Symbol.iterator method cannot be bound. | 364 365**示例:** 366```ts 367let deque = new Deque(); 368deque.insertFront(2); 369deque.insertFront(4); 370deque.insertFront(5); 371deque.insertFront(4); 372 373// 使用方法一: 374for (let item of deque) { 375 console.log("value:" + item); 376} 377 378// 使用方法二: 379let iter = deque[Symbol.iterator](); 380let temp = iter.next().value; 381while(temp != undefined) { 382 console.log("value:" + temp); 383 temp = iter.next().value; 384} 385```