我认为基于层级的方法是不错的,但前提是听众总是处于较低的水平。
思路:
在一个二维数组中包含实际数据,第一个索引是层级,第二个是该层级上的位置。让每个元素都有一个“willBeRecalculated”标志。
为每个层级(因此是列表的数组)设置一个“toBeRecalculated”的列表。
对于每个元素,都有一个包含2个整数的元素列表(即听众),一个用于层级,一个用于索引。
对于要修改的每个元素,请将该元素添加到适当层级的“toBeRecalculated”中,并将“willBeRecalculated”设置为true。
然后从第一个到最后一个层级遍历“toBeRecalculated”,重新计算每个元素,将其“willBeRecalculated”设置为false,并查找适用的元素,如果“willBeRecalculated”为true,则不执行任何操作,否则,将其(听众的)“willBeRecalculated”设置为true,并将其添加到“toBeRecalculated”中。
这种方法不需要遍历所有数据来检查需要修改/已经修改的内容,它仅检查适用的元素,而且没有重复计算。
示例:
[[E, U, P, F, D],
[E+U, F/D],
[E/E+D, F/D/P],
[P+E/E+U]
]
听众:
E:[(1,0), (2,0)] // E+U and E/E+U
U:[(1,0)] // E+U
P:[(2,1), (3,0)]
F:[(1,1)]
D:[(1,1)]
E+U:[(2,0)]
F/D:[(2,1)]
E/E+U:[(3,0)]
修改 E
和 U
:
将E
和U
添加到toBeRecalculated [0]
中,并为两者设置willBeRecalculated
为true。
遍历toBeRecalculated [0]
。
修改E
时,将其willBeRecalculated
设置为false,并将E+U
的willBeRecalculated
设置为true并将其添加到toBeRecalculated [1]
中,并将E/E+U
的willBeRecalculated
设置为true并将其添加到toBeRecalculated [2]
中。
修改U
时,将其willBeRecalculated
设置为false,然后我们检查E+U
的willBeRecalculated
并看到它为true,因此什么也不做。
然后遍历toBeRecalculated [1]
。修改E+U
时,将其willBeRecalculated
设置为false,并检查E/E+U
的willBeRecalculated
并看到它为true,因此什么也不做。
注意:
将监听器指针指向元素而不是级别和索引变量可能更好。