HarmonyOS リニアコンテナの機能と使用シナリオ

線形コンテナーは、順次アクセスできるデータ構造を実装しており、最下層は主に ArrayList、Vector、List、LinkedList、Deque、Queue、Stack などの配列を通じて実装されます。

リニアコンテナはデータアクセスの速度を十分に考慮しており、追加、削除、変更、クエリなどの操作を実行時に単一のバイトコード命令で完了できます。

配列リスト

ArrayList は、グローバル配列オブジェクトの構築に使用できる動的配列です。ArrayList は、コレクション内の要素を頻繁に読み取る必要がある場合にお勧めします。

一般的な定義によれば、ArrayList は、保存場所が初期容量 10 の連続したメモリ空間である必要があり、動的拡張をサポートしており、各拡張サイズは元の容量の 1.5 倍です。

ArrayList に対する操作の追加、削除、変更、クエリによく使用される API は次のとおりです。

操作する

説明する

要素を追加する

add(element: T) 関数を使用して、毎回 1 つの要素を配列の末尾に追加します。

insert(element:T,index:number)で指定した位置に要素を挿入します。

アクセス要素

指定したインデックスに対応する値を arr[index] で取得し、アクセス速度を確保するために命令で取得します。

forEach(callbackFn: (value: T,index?:number,arrlist?:ArrayList<T>) => void, thisArg?: Object): void を通じて、ArrayList コンテナー全体の要素にアクセスします。

[Symbol.iterator]():IterableIterator<T> イテレータを介したデータ アクセス。

要素を変更する

arr[index] = xxx を使用して、指定されたインデックス位置に対応する値を変更します。

要素の削除

最初に一致した要素を、remove(element: T) によって削除します。

RemoveByRange(fromIndex:number,toIndex:number) を使用して、指定された範囲内の要素を削除します。

ベクター

Vector は、グローバル配列オブジェクトの構築に使用できる連続ストレージ構造を指します。一般的な定義に基づいて、Vector は、保存場所が初期容量 10 の連続メモリ空間であることを必要とし、各拡張が元の容量の 2 倍になる動的拡張をサポートします。

Vector とArrayList は、両方とも配列に基づいて実装されるという点で似ていますが、Vector は配列を操作するためのより多くのインターフェイスを提供します。Vector は、オペレーター アクセスのサポートに加えて、get/set インターフェイスも追加して、さまざまなシナリオでのユーザーのニーズを満たす、より完全な検証およびフォールト トレランス メカニズムを提供します。

API バージョン 9 以降、このインターフェイスはメンテナンスされなくなったため、 ArrayListを使用することをお勧めします

Vector が追加、削除、変更、検索操作を実行するために使用する一般的な API は次のとおりです。

操作する

説明する

要素を追加する

add(element: T) 関数を使用して、毎回 1 つの要素を配列の末尾に追加します。

insert(element:T,index:number)で指定した位置に要素を挿入します。

アクセス要素

指定したインデックスに対応する値をvec[index]で取得し、アクセス速度を確保するために命令で取得します。

get(index:number) により、指定されたインデックス位置に対応する要素を取得します。

getLastElement() を通じて最後の要素を取得します。

getIndexOf(element:T) を通じて、最初に一致した要素の位置を取得します。

getLastIndexOf(element:T) を通じて、最後に一致した要素の位置を取得します。

forEach(callbackFn: (value: T,index?:number,Vector?: Vector<T>) => void, thisArg?: Object) を通じて Vector 全体の要素にアクセスします。

[Symbol.iterator]():IterableIterator<T> イテレータを介したデータ アクセス。

要素を変更する

vec[index]=xxx を通じて、指定されたインデックス位置に対応する値を変更します。

set(index:number,element:T) を介して、指定されたインデックス位置にある要素の値を element に変更します。

setLength(newSize:number) を通じて Vector の長さを設定します。

要素の削除

RemoveByIndex(index:number) を使用して、インデックス位置に対応する値を削除します。

最初に一致した要素を、remove(element:T) によって削除します。

RemoveByRange(fromIndex:number,toIndex:number) を使用して、指定された範囲内の要素を削除します。

リスト

List は、一方向のリンク リスト オブジェクトを構築するために使用できます。つまり、ヘッド ノードからテール ノードへのみアクセスできます。一般的な定義によれば、メモリ内の List の格納場所は不連続になる可能性があります。

List とLinkedListと比較すると、 LinkedList は二重リンク リストであり、先頭と末尾の項目をすばやく追加および削除できます。一方、 List は一方向のリンク リストであり、両方向に操作することはできません。

頻繁に挿入と削除が必要な場合は、効率的な操作のために List を使用することをお勧めします。

格納された要素は、get/set などのインターフェイスを介して変更できます。List に対する操作の追加、削除、変更、クエリを実行するための一般的な API は次のとおりです。

操作する

説明する

要素を追加する

add(element: T) 関数を使用して、毎回 1 つの要素を配列の末尾に追加します。

insert(element:T,index:number)で指定した位置に要素を挿入します。

アクセス要素

list[index]で指定したインデックスに対応する値を取得し、アクセス速度を確保するために命令で取得します。

get(index:number) により、指定されたインデックス位置に対応する要素を取得します。

getFirst() を通じて最初の要素を取得します。

getLast() を通じて最後の要素を取得します。

getIndexOf(element: T) を通じて、最初に一致した要素の位置を取得します。

getLastIndexOf(element: T) を通じて、最後に一致した要素の位置を取得します。

通过forEach(callbackfn: (value:T, index?: number, list?: List<T>)=> void,thisArg?: Object)访问整个List的元素。

通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。

修改元素

通过list[index] = xxx修改指定index位置对应的value值。

通过set(index:number, element: T)修改指定index位置的元素值为element。

通过replaceAllElements(callbackFn:(value: T,index?: number,list?: List<T>)=>T,thisArg?: Object)对List内元素进行替换操作。

删除元素

通过removeByIndex(index:number)删除index位置对应的value值。

通过remove(element:T)删除第一个匹配到的元素。

LinkedList

LinkedList可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历List。LinkedList依据泛型定义,在内存中的存储位置可以是不连续的。

LinkedList和List相比,LinkedList是双向链表,可以快速地在头尾进行增删,而List是单向链表,无法双向操作。

LinkedList和ArrayList相比,插入数据效率LinkedList优于ArrayList,而查询效率ArrayList优于LinkedList。

当需要频繁的插入删除时,推荐使用LinkedList高效操作。

可以通过get/set等接口对存储的元素进行修改,LinkedList进行增、删、改、查操作的常用API如下:

操作

描述

增加元素

通过add(element: T)函数每次在数组尾部增加一个元素。

通过insert(index: number, element: T)在指定位置插入一个元素。

访问元素

通过list[index]获取指定index对应的value值,通过指令获取保证访问速度。

通过get(index: number)获取指定index位置对应的元素。

通过getFirst()获取第一个元素。

通过getLast()获取最后一个元素。

通过getIndexOf(element: T)获取第一个匹配到元素的位置。

通过getLastIndexOf(element: T)获取最后一个匹配到元素的位置。

通过forEach(callbackFn: (value: T, index?: number, list?: LinkedList<T>) => void, thisArg?: Object)访问整个LinkedList的元素。

通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。

修改元素

通过list[index]=xxx修改指定index位置对应的value值。

通过set(index: number,element: T)修改指定index位置的元素值为element。

删除元素

通过removeByIndex(index: number)删除index位置对应的value值。

通过remove(element: T)删除第一个匹配到的元素。

Deque

Deque可用来构造双端队列对象,存储元素遵循先进先出以及先进后出的规则,双端队列可以分别从队头或者队尾进行访问。

Deque依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。Deque底层采用循环队列实现,入队及出队操作效率都比较高。

Deque和Queue相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。

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

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

Deque进行增、删、改、查操作的常用API如下:

操作

描述

增加元素

通过insertFront(element: T)函数每次在队头增加一个元素。

增加元素

通过insertEnd(element: T)函数每次在队尾增加一个元素。

访问元素

通过getFirst()获取队首元素的value值,但是不进行出队操作。

通过getLast()获取队尾元素的value值,但是不进行出队操作。

通过popFirst()获取队首元素的value值,并进行出队操作。

通过popLast()获取队尾元素的value值,并进行出队操作。

通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>) => void, thisArg?: Object)访问整个Deque的元素。

通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。

修改元素

通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>)=> void, thisArg?: Object)对队列进行修改操作。

删除元素

通过popFirst()对队首元素进行出队操作并删除。

通过popLast()对队尾元素进行出队操作并删除。

Queue

Queue可用来构造队列对象,存储元素遵循先进先出的规则。

Queue依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。

Queue底层采用循环队列实现,入队及出队操作效率都比较高。

Queue和Deque相比,Queue只能在一端删除一端增加,Deque可以两端增删。

一般符合先进先出的场景可以使用Queue。

Queue进行增、删、改、查操作的常用API如下:

操作

描述

增加元素

通过add(element: T)函数每次在队尾增加一个元素。

访问元素

通过getFirst()获取队首元素的value值,但是不进行出队操作。

通过pop()获取队首元素的value值,并进行出队操作。

通过forEach(callbackFn: (value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)访问整个Queue的元素。

通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。

修改元素

通过forEach(callbackFn:(value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)对队列进行修改操作。

删除元素

通过pop()对队首进行出队操作并删除。

Stack

Stack可用来构造栈对象,存储元素遵循先进后出的规则。

一般的な定義に基づいて、Stack は、初期容量が 8 の連続したメモリ空間であることを要求し、各拡張は元の容量の 1.5 倍の動的拡張をサポートします。スタックの最下層は配列に基づいて実装されており、スタックのプッシュとポップアウトは配列の端から操作されます。

Queueと比較すると、 Queue は循環キューに基づいており、一方の端でのみ削除し、もう一方の端で挿入することができますが、 Stack は一方の端で動作します。

一般に、スタックは先入れ後出しのシナリオで使用できます。

操作の追加、削除、変更、クエリを実行するためのスタックの一般的な API は次のとおりです。

操作する

説明する

要素を追加する

Push(item:T) 関数を使用して、毎回 1 つの要素をスタックの先頭に追加します。

アクセス要素

Peak() を通じてスタックの最上位要素の値を取得しますが、スタックをポップしません。

Pop() を通じてスタックの先頭にある値を取得し、それをスタックから取り出します。

forEach(callbackFn: (value: T,index?:number,stack?:Stack<T>) => void, thisArg?:Object) を通じてスタック全体の要素にアクセスします。

[Symbol.iterator]():IterableIterator<T> イテレータを介したデータ アクセス。

locate(element:T)により要素に対応する位置を取得します。

要素を変更する

forEach(callbackFn:(value: T,index?:number,stack?:Stack<T>) => void, thisArg?:Object) を通じてスタック内の要素を変更します。

要素の削除

Pop() を使用してスタックの最上位をポップし、削除します。

直線コンテナの使用

ここでは、一般的に使用される線形コンテナーである ArrayList、Vector、Deque、Stack、List の使用例を示します。これには、モジュールのインポート、要素の追加、要素へのアクセス、要素の変更などの操作が含まれます。サンプルコードは次のようになります。

// ArrayList
import ArrayList from '@ohos.util.ArrayList'; // 导入ArrayList模块

let arrayList = new ArrayList();
arrayList.add('a');
arrayList.add(1); // 增加元素
console.info(`result: ${arrayList[0]}`); // 访问元素
arrayList[0] = 'one'; // 修改元素
console.info(`result: ${arrayList[0]}`);

// Vector
import Vector from '@ohos.util.Vector'; // 导入Vector模块

let vector = new Vector();
vector.add('a');
let b1 = [1, 2, 3];
vector.add(b1);
vector.add(false); // 增加元素
console.info(`result: ${vector[0]}`); // 访问元素
console.info(`result: ${vector.getFirstElement()}`); // 访问元素

// Deque
import Deque from '@ohos.util.Deque'; // 导入Deque模块

let deque = new Deque;
deque.insertFront('a');
deque.insertFront(1); // 增加元素
console.info(`result: ${deque[0]}`); // 访问元素
deque[0] = 'one'; // 修改元素
console.info(`result: ${deque[0]}`);

// Stack
import Stack from '@ohos.util.Stack'; // 导入Stack模块 

let stack = new Stack();
stack.push('a');
stack.push(1); // 增加元素
console.info(`result: ${stack[0]}`); // 访问元素
stack.pop(); // 弹出元素
console.info(`result: ${stack.length}`);

// List
import List from '@ohos.util.List'; // 导入List模块

let list = new List;
list.add('a');
list.add(1);
let b2 = [1, 2, 3];
list.add(b2); // 增加元素
console.info(`result: ${list[0]}`); // 访问元素
console.info(`result: ${list.get(0)}`); // 访问元素

おすすめ

転載: blog.csdn.net/HarmonyOSDev/article/details/133312266