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