gpt4 book ai didi

java - 对 ObservableList 进行排序时抛出的更改通知数

转载 作者:行者123 更新时间:2023-11-30 07:44:01 25 4
gpt4 key购买 nike

我在玩 JavaFX 时,偶然发现了 Oracle 的 Using JavaFX Collections教程,遇到一个问题。在示例 1-6 中,他们使用 FXCollectionsObservableList 进行排序:

List<String> list = new ArrayList<String>();
list.add("d");
list.add("b");
list.add("a");
list.add("c");

ObservableList<String> observableList = FXCollections.observableList(list);
observableList.addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
System.out.println("Detected a change! ");
}
});

FXCollections.sort(observableList); // one notification, as expected
// Collections.sort(observableList); // also only one notification. why?

根据教程,只打印了一个更改通知。本教程提到,当使用 Collections.sort() 而不是 FXCollections.sort() 时,将会有四个更改通知,但我仍然只收到一个。有什么想法吗?需要做什么才能获得四个更改通知?

最佳答案

来自SortableList API(似乎无法在网上找到javadoc):

SortableList is a list that can sort itself in an efficient way, in contrast to the Collections.sort() method which threat all lists the same way. E.g. ObservableList can sort and fire only one notification.

本质上:

  • 您调用 FXCollections.sort在您的ObservableList上,源自 SortableList
  • FXCollections.sort将转换您的ObservableListSortableList ,并调用 ((SortableList<? extends T>)list).sort();
  • 具体类型好像是com.sun.javafx.collections.ObservableListWrapper
  • 反过来,该操作声称在排序时仅触发 1 通知

注意 (I):FXCollections.sort 的 JDK8u45 来源这里...

/**
* Sorts the provided observable list.
* Fires only <b>one</b> change notification on the list.
* @see Collections#sort(java.util.List)
*/
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(ObservableList<T> list) {
if (list instanceof SortableList) {
((SortableList<? extends T>)list).sort(); // here's what happens
} else {
List<T> newContent = new ArrayList<T>(list);
Collections.sort(newContent);
list.setAll((Collection<T>)newContent);
}
}

注释 (II):来源 ObservableListWrapper.sort ...

@Override
public void sort(Comparator<? super E> comparator) {
if (backingList.isEmpty()) {
return;
}
int[] perm = getSortHelper().sort(backingList, comparator);
// here's the single change fired
fireChange(new SimplePermutationChange<E>(0, size(), perm, this));
}

如您所见,fireChange实际执行排序后,调用将触发一次

更新

Collections.sort习语调用 List.sort 。在 Java 8 中,List.sort实际上有一个default实现,但这里没有使用它,因为它被覆盖了,所以现有的机制仍然来自 ObservableListWrapper .

TL;DR

我怀疑是否有任何优雅的方法可以获取与对 List 进行排序所需的操作数量一样多的通知。 ,除非您使用自己的 ObservableList 实现.

快速技巧!(在 Java 8 中测试)

我刚刚发现了一个可以实际触发多个 Changed 的技巧事件。

如果您使用以下惯用语:

Collections.sort(observableList.subList(0, observableList.size()));

原因是subList将返回 List ,因此 default List.sort将被使用。

关于java - 对 ObservableList 进行排序时抛出的更改通知数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com