• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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结果的变化,并按照修复后的结果进行代码适配。