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<T> 500 501返回包含此映射中键值的新迭代器对象。 502 503**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 504 505**系统能力:** SystemCapability.Utils.Lang 506 507**返回值:** 508 509| 类型 | 说明 | 510| -------- | -------- | 511| IterableIterator<T> | 返回一个迭代器。 | 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<T>) => 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<T> | 否 | 当前调用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<T> 641 642返回一个迭代器,迭代器的每一项都是一个JavaScript对象,并返回该对象。 643 644**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 645 646**系统能力:** SystemCapability.Utils.Lang 647 648**返回值:** 649 650| 类型 | 说明 | 651| -------- | -------- | 652| IterableIterator<T> | 返回一个迭代器。 | 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```