我有一个Java ObservableList,其中包含数千个条目,每秒支持数百个更新,支持JavaFX TableView。
ObservableList为backed by an ArrayList。任意排序顺序可以应用于列表。更新可能会更改列表中单个实体的排序顺序。如果我在每次更新后尝试进行排序,那么我会遇到性能问题,所以目前我有一个后台任务,每秒执行一次排序。但是,如果可能的话,我想尝试实时排序。
假设列表已经排序并且我知道要更改的元素的索引,是否有更有效的方法来更新元素的索引而不是再次在列表上调用sort?
我已经确定我可以使用Collections.binarySearch()
来有效地找到要更新的元素的索引。是否还有一种方法可以有效地找到更新后的元素需要移动到的索引并移动ArrayList以使其保持有序?
我还需要处理添加和删除操作,但这些操作不太常见。
答案 0 :(得分:4)
我会使用TreeSet。它可以使用O(log N)
时间复杂度更新订单,而ArrayList将针对每个条目执行O(n)
的插入排序。
答案 1 :(得分:4)
在处理JavaFX ObservableList / TableView组合的排序时提出一些建议:
确保您的模型类包含属性访问器。
由于JavaFX 2.2实现中存在奇怪的怪癖(JavaFX 8+中没有),因此在处理没有属性访问器的大型数据模型时,TableView的效率远远低于处理包含属性的大型数据模型时的效率。存取功能。有关详细信息,请参阅JavaFx tableview sort is really slow how to improve sort speed as in java swing。
对ObservableList执行批量更改。
每次修改正在观察的ObservableList时,都会触发列表中的列表更改侦听器,以将更改的排列传达给观察者。通过减少在列表中进行的修改次数,可以减少发生的更改事件的数量,从而减少观察者通知和处理的开销。
此示例技术可能是将列表数据的镜像副本保留在标准的不可观察列表中,对该数据进行排序,然后在单个操作中将该排序数据设置到可观察列表中。
为了避免过早的优化问题,如果操作最初很慢并且优化本身提供了显着的可衡量的改进,则只进行这种优化。
请勿更频繁地更新ObservableList。
默认情况下,JavaFX显示帧率为60fps。更新可见组件的频率高于一次脉冲(帧渲染触发器)是不必要的,因此请为每个脉冲批量更新所有更改。
例如,如果每毫秒都有一条新记录,请整理每20毫秒内记录的所有记录并一次性应用这些记录。
为了避免过早的优化问题,如果操作最初很慢并且优化本身提供了显着的可衡量的改进,则只进行这种优化。
Java 8包含一些新类,以帮助在表中使用已排序的内容。
我真的不知道TableView排序函数和SortList如何在Java 8中工作。您可以通过发送电子邮件jfx-docs-feedback_ww @ oracle请求Oracle编写带有Java 8 TableView排序功能的示例和最佳实践的教程。 .COM
有关进一步参考,请参阅javadoc:
答案 2 :(得分:4)
关于你的答案,FXCollections.sort()应该更快,因为它更好地处理FX-Properties,专门为ObservableLists编写。
答案 3 :(得分:2)
不清楚的是,您是否需要整个列表进行排序?如果您只是为了更快地检索和更新条目而对其进行排序,则可以使用HashMap更快地完成此操作。如果在类中的键字段上实现正确的hashCode()和equals()方法,则可以创建HashMap<YourClass, YourClass>
。如果您只需要偶尔输出一个排序列表,也可以实现Comparable<YourClass>
接口并创建一个TreeSet<YourClass>( map.keySet() )
,这将创建一个排序表示,同时HashMap中的数据保持不变。如果您需要它总是排序,您可以考虑使用TreeMap<YourClass,YourClass>
而不是HashMap。地图比集更容易,因为它们提供了一种检索对象的方法。
答案 4 :(得分:1)
经过一些研究,我得出结论,Collections.sort()非常快,即使对于1项也是如此。我没有找到比更新列表中的项目更有效的方法,只是调用sort。我不能使用TreeSet,因为TableView依赖于List接口,每次更改排序顺序时我都必须重建TreeSet。
我发现我可以使用Timer或KeyFrame以60 FPS更新,但仍然具有合理的性能。如果没有升级到JavaFX 8,我还没有找到更好的解决方案。
答案 5 :(得分:0)
您可以将元素从数组列表中拉出并插入(按排序顺序)更新的元素。