将ObservableList从高到低排序 - javafx

时间:2014-10-28 16:48:08

标签: javafx

有没有办法根据从高到低的值对ObservableList进行排序?

说我有一个

ObservableList<XYChart.Data> data;

包含String和Double。我希望列表根据Double从最高到最低值排序。我想要这个的原因是因为如果从最高到最低显示它们的值,图表看起来会更好。

我现在有这样的事情:

sortedData = new SortedList<>(data);
sortedData.comparatorProperty().bind(mycomparatorProperty());

1 个答案:

答案 0 :(得分:3)

您可以创建Comparator,按Y值进行比较,然后按顺序反转:

data.sort(Comparator.comparing(XYChart.Data<String,Double>::getYValue).reversed());

这会根据您的意愿对您的收藏品进行排序。

或者您可以返回新的收藏品:

List<XYChart.Data<String,Double>> sortedData = 
    data.stream()
        .sorted(Comparator.comparing(XYChart.Data<String,Double>::getYValue).reversed())
        .collect(Collectors.toList());

修改

为了清楚起见,这是一个完整的样本:

public class FXMain extends Application {

    private final ObservableList<XYChart.Data<String,Double>> data = 
            FXCollections.observableArrayList(
                    new XYChart.Data("P1",200d),
                    new XYChart.Data("P2",150d),
                    new XYChart.Data("P3",250d));

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button"Sort data!");
        btn.setOnAction(e -> {
           ObservableList<XYChart.Data<String,Double>> data2 = 
                data.stream()
                    .sorted(Comparator.
                           comparing(XYChart.Data<String,Double>::getYValue).reversed())
                    .peek(System.out::println)
                    .collect(Collectors.toCollection(()->FXCollections.observableArrayList()));
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}