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> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 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(); 159deque.insertFront("squirrel"); 160let result = deque.has("squirrel"); 161``` 162 163### popFirst 164 165popFirst(): T 166 167删除并返回双端队列的首元素。 168 169**系统能力:** SystemCapability.Utils.Lang 170 171**返回值:** 172 173| 类型 | 说明 | 174| -------- | -------- | 175| T | 返回被删除的首元素。 | 176 177**错误码:** 178 179以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 180 181| 错误码ID | 错误信息 | 182| -------- | -------- | 183| 10200011 | The popFirst method cannot be bound. | 184 185**示例:** 186 187```ts 188let deque = new Deque(); 189deque.insertFront(2); 190deque.insertFront(4); 191deque.insertEnd(5); 192deque.insertFront(2); 193deque.insertFront(4); 194let result = deque.popFirst(); 195``` 196 197### popLast 198 199popLast(): T 200 201删除并返回双端队列的尾元素。 202 203**系统能力:** SystemCapability.Utils.Lang 204 205**返回值:** 206 207| 类型 | 说明 | 208| -------- | -------- | 209| T | 返回被删除的尾元素。 | 210 211**错误码:** 212 213以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 214 215| 错误码ID | 错误信息 | 216| -------- | -------- | 217| 10200011 | The popLast method cannot be bound. | 218 219**示例:** 220 221```ts 222let deque = new Deque(); 223deque.insertFront(2); 224deque.insertEnd(4); 225deque.insertFront(5); 226deque.insertFront(2); 227deque.insertFront(4); 228let result = deque.popLast(); 229``` 230 231### forEach 232 233forEach(callbackFn: (value: T, index?: number, deque?: Deque<T>) => void, 234thisArg?: Object): void 235 236通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。 237 238**系统能力:** SystemCapability.Utils.Lang 239 240**参数:** 241 242| 参数名 | 类型 | 必填 | 说明 | 243| -------- | -------- | -------- | -------- | 244| callbackFn | function | 是 | 回调函数。 | 245| thisArg | Object | 否 | callbackfn被调用时用作this值。 | 246 247callbackfn的参数说明: 248 249| 参数名 | 类型 | 必填 | 说明 | 250| -------- | -------- | -------- | -------- | 251| value | T | 是 | 当前遍历到的元素。 | 252| index | number | 否 | 当前遍历到的下标值。 | 253| deque | Deque<T> | 否 | 当前调用forEach方法的实例对象。 | 254 255**错误码:** 256 257以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 258 259| 错误码ID | 错误信息 | 260| -------- | -------- | 261| 10200011 | The forEach method cannot be bound. | 262 263**示例:** 264 265```ts 266let deque = new Deque(); 267deque.insertFront(2); 268deque.insertEnd(4); 269deque.insertFront(5); 270deque.insertEnd(4); 271deque.forEach((value, index) => { 272 console.log("value:" + value, "index:" + index); 273}); 274``` 275 276### getFirst 277 278getFirst(): T 279 280获取Deque实例中的头元素。 281 282**系统能力:** SystemCapability.Utils.Lang 283 284**返回值:** 285 286| 类型 | 说明 | 287| -------- | -------- | 288| T | 返回T型 | 289 290**错误码:** 291 292以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 293 294| 错误码ID | 错误信息 | 295| -------- | -------- | 296| 10200011 | The getFirst method cannot be bound. | 297 298**示例:** 299 300```ts 301let deque = new Deque(); 302deque.insertEnd(2); 303deque.insertEnd(4); 304deque.insertFront(5); 305deque.insertFront(4); 306let result = deque.getFirst(); 307``` 308 309### getLast 310 311getLast(): T 312 313获取Deque实例中的尾元素。 314 315**系统能力:** SystemCapability.Utils.Lang 316 317**返回值:** 318 319| 类型 | 说明 | 320| -------- | -------- | 321| T | 返回T型 | 322 323**错误码:** 324 325以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 326 327| 错误码ID | 错误信息 | 328| -------- | -------- | 329| 10200011 | The getLast method cannot be bound. | 330 331**示例:** 332 333```ts 334let deque = new Deque(); 335deque.insertFront(2); 336deque.insertFront(4); 337deque.insertFront(5); 338deque.insertFront(4); 339let result = deque.getLast(); 340``` 341 342### [Symbol.iterator] 343 344[Symbol.iterator]\(): IterableIterator<T> 345 346返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。 347 348**系统能力:** SystemCapability.Utils.Lang 349 350**返回值:** 351 352| 类型 | 说明 | 353| -------- | -------- | 354| IterableIterator<T> | 返回一个迭代器。 | 355 356**错误码:** 357 358以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 359 360| 错误码ID | 错误信息 | 361| -------- | -------- | 362| 10200011 | The Symbol.iterator method cannot be bound. | 363 364**示例:** 365```ts 366let deque = new Deque(); 367deque.insertFront(2); 368deque.insertFront(4); 369deque.insertFront(5); 370deque.insertFront(4); 371 372// 使用方法一: 373for (let item of deque) { 374 console.log("value:" + item); 375} 376 377// 使用方法二: 378let iter = deque[Symbol.iterator](); 379let temp = iter.next().value; 380while(temp != undefined) { 381 console.log("value:" + temp); 382 temp = iter.next().value; 383} 384```