1# ArkTS方舟编程语言Changelog 2 3## cl.arkts.1 TreeSet/TreeMap扩容导致比较器丢失问题正向修复 4 5**访问级别** 6 7公开能力 8 9**变更原因** 10 11使用TreeSet/TreeMap模块的add接口触发扩容时,TreeSet/TreeMap自定义比较器会在扩容后丢失,导致扩容之后进行系统默认排序。 12 13**变更影响** 14 15此变更涉及应用适配。 16 17**变更前:** 18 19对于下述代码,预期结果与实际执行结果不一致,结果出现错误。 20 21原因在于扩容后比较器丢失,remove(a1)失败,后续行为异常。 22 23```ts 24import TreeSet from '@kit.ArkTS'; 25class A { 26time: number; 27constructor(time: number) { 28 this.time = time; 29} 30static readonly compared = ((first: A, second: A): number => { 31 return second.time - first.time; 32 }) as Function as (first: A, second: A) => boolean; 33} 34const a1 = new A(1); 35const a2 = new A(2); 36const a3 = new A(3); 37const a4 = new A(4); 38const a5 = new A(5); 39const a6 = new A(6); 40const set = new TreeSet<A>(A.compared); // 在add扩容后A.compared丢失 41set.add(a1); 42set.add(a2); 43set.add(a3); // 触发扩容,A.compared丢失 44set.add(a4); 45set.add(a5); 46set.add(a6); 47for (let i = 0; i < 5; ++i) { 48 set.remove(a1); // 同一个红黑树前后用了两种比较规则,数据结构的性质被破坏 49 console.info(set.has(a1).toString()); 50 // 预期结果:false、false、false、false、false 51 // 实际结果:false、false、true、true、true 52 set.add(a1); 53} 54for (let item of set) { 55 console.info(item.time.toString()); 56 // 预期结果:6、5、4、3、2、1 57 // 实际结果:6、1、1 58} 59``` 60 61**变更后:** 62 63TaggedTree比较器扩容前后一致,TaggedTree的所有add、remove都用同一个比较规则,输出结果与预期一致。 64 65**起始 API Level** 66 678 68 69**变更发生版本** 70 71从OpenHarmony SDK 6.0开始。 72 73**变更的接口/组件** 74 75TreeSet、TreeMap 76 77**适配指导** 78 79行为变更,绝大多数情况不需要开发者进行适配。 80 81只有当开发者用到自定义比较器,且将原本错误的结果当成正确的结果进行使用时,需注意TreeSet/TreeMap结果的变化,并按照修复后的结果进行代码适配。