HarmonyOS 使用 线性容器Deque 的优点

  1. 双端操作高效

    • Deque(double ended queue)即双端队列,根据循环队列的数据结构实现,支持在队列的两端进行元素的插入和移除操作。
    • 与只能在一端删除、另一端增加元素的Queue相比,Deque提供了更灵活的操作方式。
  2. 动态扩容能力

    • Deque会根据实际需要动态调整容量,每次扩容大小为原始容量的两倍,这有助于在处理不确定大小的数据集时提高性能。
  3. 高效的元素访问

    • 虽然Deque不能进行中间插入操作,但在其头部和尾部的插入、删除操作效率较高。
    • 这使得Deque在处理需要频繁在集合两端进行增删元素的操作时表现出色。
  4. 丰富的API支持

    • HarmonyOS为Deque提供了丰富的API,如insertFrontinsertEndpopFirstpopLast等,方便开发者进行各种操作。
    • 这些API使得Deque的使用更加灵活和便捷。
  5. 类型安全

    • Deque支持泛型,可以在声明时指定存储元素的类型,从而提高代码的类型安全性和可读性。

 

Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。

Deque和Queue相比,Deque允许在两端执行增删元素的操作,Queue只能在头部删除元素,尾部增加元素。

Vector相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。

推荐使用场景: 需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。

线性容器Deque

1. constructor

2. insertFront

3. insertEnd

4. has

5. popFirst

6. popLast

7. forEach

8. getFirst

9. getLast

10. Symbol.iterator

Deque

属性

名称 类型 可读 可写 说明
length number Deque的元素个数。

1. constructor

constructor()

Deque的构造函数。


使用方式:

let deque: Deque<string | number | boolean | Object> = new Deque();

2. insertFront

insertFront(element: T): void

在deque头部插入元素。

参数:

参数名 类型 必填 说明
element T 插入的元素。

使用方式:

class C1 {
name: string = ""
age: string = ""
}
let deque: Deque<string | number | boolean | Array<number> | C1> = new Deque();
deque.insertFront("a");
deque.insertFront(1);
let b = [1, 2, 3];
deque.insertFront(b);
let c: C1 = {name : "Dylan", age : "13"};
deque.insertFront(c);
deque.insertFront(false);

3. insertEnd

insertEnd(element: T): void

在deque尾部插入元素。

参数:

参数名 类型 必填 说明
element T 插入的元素。

使用方式:

class C1 {
name: string = ""
age: string = ""
}

let deque: Deque<string | number | boolean | Array<number> | C1> = new Deque();
deque.insertEnd("a");
deque.insertEnd(1);
let b = [1, 2, 3];
deque.insertEnd(b);
let c: C1 = {name : "Dylan", age : "13"};
deque.insertEnd(c);
deque.insertEnd(false);

4. has

has(element: T): boolean

判断此Deque中是否含有该指定元素。

参数:

参数名 类型 必填 说明
element T 指定的元素。

返回值:

类型 说明
boolean 如果包含指定元素返回true,否则返回false。

使用方式:

let deque: Deque<string> = new Deque();
deque.insertFront("squirrel");
let result = deque.has("squirrel");

5. popFirst

popFirst(): T

删除并返回双端队列的首元素。

返回值:

类型 说明
T 返回被删除的首元素。

使用方式:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertEnd(5);
deque.insertFront(2);
deque.insertFront(4);
let result = deque.popFirst();

6. popLast

popLast(): T

删除并返回双端队列的尾元素。

返回值:

类型 说明
T 返回被删除的尾元素。

使用方式:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertFront(2);
deque.insertFront(4);
let result = deque.popLast();

7. forEach

forEach(callbackFn: (value: T, index?: number, deque?: Deque<T>) => void,thisArg?: Object): void

通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。

参数:

参数名 类型 必填 说明
callbackFn function 回调函数。
thisArg Object callbackfn被调用时用作this值,默认值为当前实例对象。

callbackfn的参数说明:

参数名 类型 必填 说明
value T 当前遍历到的元素。
index number 当前遍历到的下标值,默认值为0。
deque Deque<T> 当前调用forEach方法的实例对象,默认值为当前实例对象。

使用方式:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertEnd(4);
deque.forEach((value: number, index?: number | undefined, deque?: Deque<number> | undefined):void => {
console.log("value:" + value, "index:" + index);
});

8. getFirst

getFirst(): T

获取Deque实例中的头元素。

返回值:

类型 说明
T 返回T类型的头元素

使用方式:

let deque: Deque<number> = new Deque();
deque.insertEnd(2);
deque.insertEnd(4);
deque.insertFront(5);
deque.insertFront(4);
let result = deque.getFirst();

9. getLast

getLast(): T

获取Deque实例中的尾元素。

返回值:

类型 说明
T 返回T类型的尾元素

使用方式:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertFront(5);
deque.insertFront(4);
let result = deque.getLast();

10. [Symbol.iterator]

[Symbol.iterator](): IterableIterator<T>

返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。

返回值:

类型 说明
IterableIterator<T> 返回一个迭代器。

使用方式一:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertFront(5);
deque.insertFront(4);

let nums: Array<number> = Array.from(deque)
for (let item of nums) {
console.log("value:" + item);
}

使用方式二:

let deque: Deque<number> = new Deque();
deque.insertFront(2);
deque.insertFront(4);
deque.insertFront(5);
deque.insertFront(4);

let iter = deque[Symbol.iterator]();
let temp:IteratorResult<number> = iter.next();
while(!temp.done) {
console.log("value:" + temp.value);
temp = iter.next();
}

 如需要其他方法 请参考官方文档

制作不易 点个关注再走吧。°(°¯᷄◠¯᷅°)°。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐