【问题标题】:SortedList does not stay sorted after I change a field更改字段后,SortedList 不会保持排序状态
【发布时间】:2014-07-31 04:36:16
【问题描述】:

我有一个充满目标的 ObservableList。我不在乎原始列表的顺序是什么。我正在使用排序列表来处理排序。

对于这个特定的列表,我让比较器根据目标的大小级别进行排序。在第一种情况下,目标一

现在,如果我通过原始列表或直接通过目标更改幅度,排序列表将不会自行排序。

但是,如果我使用排序列表中的 set() 方法,它会自行排序。没有其他方法可以设置字段并让排序列表自行排序吗?

我想对原始列表进行更改,并让排序后的列表实现这一点。

    ObservableList<Objective> list = FXCollections.observableArrayList();
    Objective one = new Objective(), two = new Objective();
    one.setMagnitude(10);
    two.setMagnitude(5);
    list.addAll(one, two);
    SortedList<Objective> sorted = new SortedList<Objective>(list,
            (Comparator<? super Objective>) (Objective x, Objective y) -> {
                int first = x.getMagnitude();
                int second = y.getMagnitude();
                if (first > second)
                    return 1;
                else if (second > first)
                    return -1;
                else
                    return 0;
            });
    System.out.println("SortedList:" + sorted.toString());
    list.get(0).setMagnitude(1);
    list.get(1).setMagnitude(50);
    System.out.println("SortedList:" + sorted.toString());
    System.out.println("Source List:" + list.toString());

SortedList:[5, 10]
SortedList:[50, 1]
Source List:[1, 50]

【问题讨论】:

  • 如果你修改sorted而不是list会发生什么。即使在开头打印list,也不会被排序。
  • 在列表中添加一个监听器并在监听器实现中触发排序。
  • 正如我上面所说,使用 sortedList.set() 实际上会修改源列表和排序列表。不同之处在于,使用 SortedList.set() 方法实际上会实时正确地对排序列表进行排序。我想在不使用该 set 方法的情况下达到相同的效果。我也尝试过手动触发 FXCollections.sort 和 sortedList.sort() ,但它们导致了错误。让我再试一次。

标签: java javafx sortedlist observablelist


【解决方案1】:

始终保持列表排序,需要跟踪所有对象更改,这是一个很大的计算开销,在大多数任务中几乎没有好处。

您应该仅在您的对象比较功能稳定后填充您的排序列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多