• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.util.TreeSet (非线性容器TreeSet)
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @xliu-huanwei; @shilei123; @huanghello-->
5<!--Designer: @yuanyao14-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9TreeSet基于[TreeMap](js-apis-treemap.md)实现,在TreeSet中,只对value对象进行处理。TreeSet可用于存储一系列值的集合,元素中value唯一且有序。
10
11TreeSet和[HashSet](js-apis-hashset.md)中的元素都不允许重复。HashSet中的数据无序存放,而TreeSet是有序存放。HashSet允许插入null值,但TreeSet不建议插入空值,可能会影响排序结果。
12
13**推荐使用场景:** 一般需要存储有序集合的场景,可以使用TreeSet。
14
15文档中使用了泛型,涉及以下泛型标记符:
16
17- T:Type,类
18
19> **说明:**
20>
21> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
22>
23> 容器类使用静态语言实现,限制了存储位置和属性,不支持自定义属性和方法。
24
25
26## 导入模块
27
28```ts
29import { TreeSet } from '@kit.ArkTS';
30```
31
32## TreeSet
33
34### 属性
35
36**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
37
38**系统能力:** SystemCapability.Utils.Lang
39
40| 名称 | 类型 | 只读 | 可选 | 说明 |
41| -------- | -------- | -------- | -------- | -------- |
42| length | number | 是 | 否 | TreeSet的元素个数。 |
43
44
45### constructor
46
47constructor(comparator?: (firstValue: T, secondValue: T) => boolean)
48
49TreeSet的构造函数,支持通过比较函数对元素进行升序或降序排序。
50
51**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
52
53**系统能力:** SystemCapability.Utils.Lang
54
55**参数:**
56
57| 参数名 | 类型 | 必填 | 说明 |
58| -------- | -------- | -------- | -------- |
59| comparator | function | 否 | 用户自定义的比较函数,可通过比较关系对元素进行排序。默认值为null,表示不提供比较函数。|
60
61comparator的参数说明:
62
63| 参数名 | 类型 | 必填 | 说明 |
64| ------| ---- | ----- | -- |
65| firstValue | T | 是 | 前一项元素。 |
66| secondValue | T | 是 | 后一项元素。 |
67
68**错误码:**
69
70以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
71
72| 错误码ID | 错误信息 |
73| -------- | -------- |
74| 401      | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. |
75| 10200012 | The TreeSet's constructor cannot be directly invoked. |
76
77**示例:**
78
79```ts
80//默认构造
81let treeSet = new TreeSet<string | number | boolean | Object>();
82```
83
84```ts
85//使用comparator firstValue < secondValue,表示期望结果为升序排序。反之firstValue > secondValue,表示为降序排序。
86let treeSet: TreeSet<string> = new TreeSet<string>((firstValue: string, secondValue: string): boolean => {
87  return firstValue < secondValue;
88});
89treeSet.add("a");
90treeSet.add("c");
91treeSet.add("d");
92treeSet.add("b");
93for (let value of treeSet) {
94  console.info("value:", value);
95}
96// value: a
97// value: b
98// value: c
99// value: d
100```
101
102```ts
103//当插入自定义类型时,则必须要提供比较函数。
104class TestEntry{
105  public id: number = 0;
106}
107let ts1: TreeSet<TestEntry> = new TreeSet<TestEntry>((t1: TestEntry, t2: TestEntry): boolean => {return t1.id > t2.id;});
108let entry1: TestEntry = {
109  id: 0
110};
111let entry2: TestEntry = {
112  id: 1
113}
114ts1.add(entry1);
115ts1.add(entry2);
116console.info("treeSet: ", ts1.length);
117```
118
119
120### isEmpty
121
122isEmpty(): boolean
123
124判断容器是否为空。
125
126**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
127
128**系统能力:** SystemCapability.Utils.Lang
129
130**返回值:**
131
132| 类型 | 说明 |
133| -------- | -------- |
134| boolean | 为空返回true,不为空返回false。 |
135
136**错误码:**
137
138以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
139
140| 错误码ID | 错误信息 |
141| -------- | -------- |
142| 10200011 | The isEmpty method cannot be bound. |
143
144**示例:**
145
146```ts
147let treeSet = new TreeSet<string>();
148let result = treeSet.isEmpty();
149console.info("result:", result);  // result: true
150```
151
152
153### has
154
155has(value: T): boolean
156
157判断容器中是否包含指定元素。
158
159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
160
161**系统能力:** SystemCapability.Utils.Lang
162
163**参数:**
164
165| 参数名 | 类型 | 必填 | 说明 |
166| -------- | -------- | -------- | -------- |
167| value | T | 是 | 指定元素。 |
168
169**返回值:**
170
171| 类型 | 说明 |
172| -------- | -------- |
173| boolean | 包含指定元素返回true,否则返回false。 |
174
175**错误码:**
176
177以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
178
179| 错误码ID | 错误信息 |
180| -------- | -------- |
181| 10200011 | The has method cannot be bound. |
182
183**示例:**
184
185```ts
186let treeSet  = new TreeSet<number>();
187treeSet.add(123);
188let result = treeSet.has(123);
189console.info("result:", result); // result: true
190```
191
192### getFirstValue
193
194getFirstValue(): T
195
196获取容器中排序第一的数据,为空时返回undefined。
197
198**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
199
200**系统能力:** SystemCapability.Utils.Lang
201
202**返回值:**
203
204| 类型 | 说明 |
205| -------- | -------- |
206| T | 返回排序第一的数据,为空时返回undefined。 |
207
208**错误码:**
209
210以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
211
212| 错误码ID | 错误信息 |
213| -------- | -------- |
214| 10200011 | The getFirstValue method cannot be bound. |
215
216**示例:**
217
218```ts
219let treeSet = new TreeSet<string>();
220treeSet.add("squirrel");
221treeSet.add("sparrow");
222let result = treeSet.getFirstValue();
223console.info("result:", result); // result: sparrow
224```
225
226
227### getLastValue
228
229getLastValue(): T
230
231获取容器中排序最后的数据,为空时返回undefined。
232
233**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
234
235**系统能力:** SystemCapability.Utils.Lang
236
237**返回值:**
238
239| 类型 | 说明 |
240| -------- | -------- |
241| T | 返回排序最后的数据,为空时返回undefined。 |
242
243**错误码:**
244
245以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
246
247| 错误码ID | 错误信息 |
248| -------- | -------- |
249| 10200011 | The getLastValue method cannot be bound. |
250
251**示例:**
252
253```ts
254let treeSet = new TreeSet<string>();
255treeSet.add("squirrel");
256treeSet.add("sparrow");
257let result = treeSet.getLastValue();
258console.info("result:", result); // result: squirrel
259```
260
261
262### add
263
264add(value: T): boolean
265
266向容器中添加一组数据。
267
268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
269
270**系统能力:** SystemCapability.Utils.Lang
271
272**参数:**
273
274| 参数名 | 类型 | 必填 | 说明 |
275| -------- | -------- | -------- | -------- |
276| value | T | 是 | 添加的成员数据。 |
277
278**返回值:**
279
280| 类型 | 说明 |
281| -------- | -------- |
282| boolean | 成功添加新数据至容器返回true,否则返回false。 |
283
284**错误码:**
285
286以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
287
288| 错误码ID | 错误信息 |
289| -------- | -------- |
290| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
291| 10200011 | The add method cannot be bound. |
292
293**示例:**
294
295```ts
296let treeSet = new TreeSet<string>();
297let result = treeSet.add("squirrel");
298console.info("result:", result); // result: true
299```
300
301
302### remove
303
304remove(value: T): boolean
305
306删除指定的元素。
307
308**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
309
310**系统能力:** SystemCapability.Utils.Lang
311
312**参数:**
313
314| 参数名 | 类型 | 必填 | 说明 |
315| -------- | -------- | -------- | -------- |
316| value | T | 是 | 指定的元素。 |
317
318**返回值:**
319
320| 类型 | 说明 |
321| -------- | -------- |
322| boolean | 成功删除元素返回true,否则返回false。 |
323
324**错误码:**
325
326以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
327
328| 错误码ID | 错误信息 |
329| -------- | -------- |
330| 10200011 | The remove method cannot be bound. |
331
332**示例:**
333
334```ts
335let treeSet = new TreeSet<string>();
336treeSet.add("squirrel");
337treeSet.add("sparrow");
338let result = treeSet.remove("sparrow");
339console.info("result:", result); // result: true
340```
341
342
343### getLowerValue
344
345getLowerValue(key: T): T
346
347获取容器中比传入元素排序靠前一位的元素,为空时返回undefined。
348
349**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
350
351**系统能力:** SystemCapability.Utils.Lang
352
353**参数:**
354
355| 参数名 | 类型 | 必填 | 说明 |
356| -------- | -------- | -------- | -------- |
357| key | T | 是 | 对比的元素值。 |
358
359**返回值:**
360
361| 类型 | 说明 |
362| -------- | -------- |
363| T | 返回排序中对比元素前一位的数据,为空时返回undefined。 |
364
365**错误码:**
366
367以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
368
369| 错误码ID | 错误信息 |
370| -------- | -------- |
371| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
372| 10200011 | The getLowerValue method cannot be bound. |
373
374**示例:**
375
376```ts
377let treeSet = new TreeSet<string>();
378treeSet.add("squirrel");
379treeSet.add("sparrow");
380treeSet.add("gander");
381let result = treeSet.getLowerValue("sparrow");
382console.info("result:", result); // result: gander
383```
384
385
386### getHigherValue
387
388getHigherValue(key: T): T
389
390获取容器中比传入元素排序靠后一位的元素,为空时返回undefined。
391
392**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
393
394**系统能力:** SystemCapability.Utils.Lang
395
396**参数:**
397
398| 参数名 | 类型 | 必填 | 说明 |
399| -------- | -------- | -------- | -------- |
400| key | T | 是 | 对比的元素。 |
401
402**返回值:**
403
404| 类型 | 说明 |
405| -------- | -------- |
406| T | 返回排序中传入元素后一位的数据。为空时返回undefined。 |
407
408**错误码:**
409
410以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
411
412| 错误码ID | 错误信息 |
413| -------- | -------- |
414| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
415| 10200011 | The getHigherValue method cannot be bound. |
416
417**示例:**
418
419```ts
420let treeSet = new TreeSet<string>();
421treeSet.add("squirrel");
422treeSet.add("sparrow");
423treeSet.add("gander");
424let result = treeSet.getHigherValue("sparrow");
425console.info("result:", result); // result: squirrel
426```
427
428
429### popFirst
430
431popFirst(): T
432
433删除容器中排序最前的数据,为空时返回undefined。
434
435**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
436
437**系统能力:** SystemCapability.Utils.Lang
438
439**返回值:**
440
441| 类型 | 说明 |
442| -------- | -------- |
443| T | 返回删除的数据,为空时返回undefined。 |
444
445**错误码:**
446
447以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
448
449| 错误码ID | 错误信息 |
450| -------- | -------- |
451| 10200011 | The popFirst method cannot be bound. |
452
453**示例:**
454
455```ts
456let treeSet = new TreeSet<string>();
457treeSet.add("squirrel");
458treeSet.add("sparrow");
459let result = treeSet.popFirst();
460console.info("result:", result); // result: sparrow
461```
462
463
464### popLast
465
466popLast(): T
467
468删除容器中排序最后的数据,为空时返回undefined。
469
470**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
471
472**系统能力:** SystemCapability.Utils.Lang
473
474**返回值:**
475
476| 类型 | 说明 |
477| -------- | -------- |
478| T | 返回删除的数据,为空时返回undefined。 |
479
480**错误码:**
481
482以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
483
484| 错误码ID | 错误信息 |
485| -------- | -------- |
486| 10200011 | The popLast method cannot be bound. |
487
488**示例:**
489
490```ts
491let treeSet = new TreeSet<string>();
492treeSet.add("squirrel");
493treeSet.add("sparrow");
494let result = treeSet.popLast();
495console.info("result:", result); // result: squirrel
496```
497
498
499### clear
500
501clear(): void
502
503清除容器中的所有元素,并将length置为0。
504
505**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
506
507**系统能力:** SystemCapability.Utils.Lang
508
509**错误码:**
510
511以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
512
513| 错误码ID | 错误信息 |
514| -------- | -------- |
515| 10200011 | The clear method cannot be bound. |
516
517**示例:**
518
519```ts
520let treeSet = new TreeSet<string>();
521treeSet.add("squirrel");
522treeSet.add("sparrow");
523treeSet.clear();
524let result = treeSet.isEmpty();
525console.info("result:", result); // result: true
526```
527
528
529### values
530
531values(): IterableIterator&lt;T&gt;
532
533返回包含此映射中键值的新迭代器对象。
534
535**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
536
537**系统能力:** SystemCapability.Utils.Lang
538
539**返回值:**
540
541| 类型 | 说明 |
542| -------- | -------- |
543| IterableIterator&lt;T&gt; | 返回一个迭代器。 |
544
545**错误码:**
546
547以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
548
549| 错误码ID | 错误信息 |
550| -------- | -------- |
551| 10200011 | The values method cannot be bound. |
552
553**示例:**
554
555```ts
556let treeSet = new TreeSet<string>();
557treeSet.add("squirrel");
558treeSet.add("sparrow");
559let values = treeSet.values();
560for (let value of values) {
561  console.info("value:", value)
562}
563// value: sparrow
564// value: squirrel
565```
566
567
568### forEach
569
570forEach(callbackFn: (value?: T, key?: T, set?: TreeSet&lt;T&gt;) => void, thisArg?: Object): void
571
572通过回调函数来遍历实例对象上的元素及其下标。
573
574**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
575
576**系统能力:** SystemCapability.Utils.Lang
577
578**参数:**
579
580| 参数名 | 类型 | 必填 | 说明 |
581| -------- | -------- | -------- | -------- |
582| callbackFn | function | 是 | 回调函数。 |
583| thisArg | Object | 否 | callbackFn被调用时用作this值,默认值为当前实例对象。 |
584
585callbackFn的参数说明:
586| 参数名 | 类型 | 必填 | 说明 |
587| -------- | -------- | -------- | -------- |
588| value | T | 否 | 当前遍历到的value元素。 |
589| key | T | 否 | 当前遍历到的key元素。 |
590| set | TreeSet&lt;T&gt; | 否 | 当前调用forEach方法的实例对象,默认值为当前实例对象。 |
591
592**错误码:**
593
594以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
595
596| 错误码ID | 错误信息 |
597| -------- | -------- |
598| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. |
599| 10200011 | The forEach method cannot be bound. |
600
601**示例:**
602
603```ts
604let treeSet = new TreeSet<string>();
605treeSet.add("sparrow");
606treeSet.add("gull");
607treeSet.forEach((value: string, key: string): void => {
608  console.info("value:" + value);
609});
610// value:gull
611// value:sparrow
612```
613```ts
614// 不建议在forEach中使用set、remove方法,会导致死循环等不可预知的风险,可使用for循环来进行插入和删除。
615let treeSet = new TreeSet<string>();
616for(let i = 0; i < 10; i++) {
617  treeSet.add("sparrow" + i);
618}
619for(let i = 0; i < 10; i++) {
620  treeSet.remove("sparrow" + i);
621}
622```
623
624### entries
625
626entries(): IterableIterator<[T, T]>
627
628返回包含此映射中键值对的新迭代器对象。
629
630**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
631
632**系统能力:** SystemCapability.Utils.Lang
633
634**返回值:**
635
636| 类型 | 说明 |
637| -------- | -------- |
638| IterableIterator<[T, T]> | 返回一个迭代器。 |
639
640**错误码:**
641
642以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
643
644| 错误码ID | 错误信息 |
645| -------- | -------- |
646| 10200011 | The entries method cannot be bound. |
647
648**示例:**
649
650```ts
651let treeSet = new TreeSet<string>();
652treeSet.add("squirrel");
653treeSet.add("sparrow");
654let it = treeSet.entries();
655let t: IteratorResult<Object[]> = it.next();
656while(!t.done) {
657  console.info("TreeSet: " + t.value[1]);
658  t = it.next()
659}
660// TreeSet: sparrow
661// TreeSet: squirrel
662```
663
664```ts
665// 不建议在entries中使用set、remove方法,会导致死循环等不可预知的风险,可使用for循环来进行插入和删除。
666let treeSet = new TreeSet<string>();
667for(let i = 0; i < 10; i++) {
668  treeSet.add("sparrow" + i);
669}
670for(let i = 0; i < 10; i++) {
671  treeSet.remove("sparrow" + i);
672}
673```
674
675### [Symbol.iterator]
676
677[Symbol.iterator]\(): IterableIterator&lt;T&gt;
678
679返回一个迭代器,迭代器的每一项都是一个JavaScript对象。
680
681**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
682
683**系统能力:** SystemCapability.Utils.Lang
684
685**返回值:**
686
687| 类型 | 说明 |
688| -------- | -------- |
689| IterableIterator&lt;T&gt; | 返回一个迭代器。 |
690
691**错误码:**
692
693以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
694
695| 错误码ID | 错误信息 |
696| -------- | -------- |
697| 10200011 | The Symbol.iterator method cannot be bound. |
698
699**示例:**
700
701```ts
702let treeSet = new TreeSet<string>();
703treeSet.add("squirrel");
704treeSet.add("sparrow");
705// 使用方法一:
706for (let item of treeSet) {
707  console.info("value:" + item);
708}
709// value:sparrow
710// value:squirrel
711
712// 使用方法二:
713let iter = treeSet[Symbol.iterator]();
714let temp: IteratorResult<string> = iter.next().value;
715while(temp != undefined) {
716  console.info("value:" + temp);
717  temp = iter.next().value;
718}
719// value:sparrow
720// value:squirrel
721```
722
723```ts
724// 不建议在Symbol.iterator中使用set、remove方法,会导致死循环等不可预知的风险,可使用for循环来进行插入和删除。
725let treeSet = new TreeSet<string>();
726for(let i = 0; i < 10; i++) {
727  treeSet.add("sparrow" + i);
728}
729for(let i = 0; i < 10; i++) {
730  treeSet.remove("sparrow" + i);
731}
732```