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<T> 532 533返回包含此映射中键值的新迭代器对象。 534 535**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 536 537**系统能力:** SystemCapability.Utils.Lang 538 539**返回值:** 540 541| 类型 | 说明 | 542| -------- | -------- | 543| IterableIterator<T> | 返回一个迭代器。 | 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<T>) => 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<T> | 否 | 当前调用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<T> 678 679返回一个迭代器,迭代器的每一项都是一个JavaScript对象。 680 681**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 682 683**系统能力:** SystemCapability.Utils.Lang 684 685**返回值:** 686 687| 类型 | 说明 | 688| -------- | -------- | 689| IterableIterator<T> | 返回一个迭代器。 | 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```