2014-10-28 132 views
0

有什麼方法可以根據從高到低的值對ObservableList進行排序嗎?將ObservableList從高排序到低排序 - javafx

說我有一個包含字符串和雙A

ObservableList<XYChart.Data> data; 

。我想根據從最高值到最低值的Double進行排序。我想要這個的原因是因爲如果圖表的值從最高到最低,圖表看起來更好。

我現在是這樣的:

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

回答

3

您可以創建一個Comparator,由Y值進行比較,然後再顛倒順序:

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

這將整理您的收藏作爲intented 。

或者你可以返回一個新的集合:

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); 
    } 
} 
+0

的http://計算器。 com/a/26508466/2715404 這是我的數據結構btw。 – miniHessel 2014-10-28 22:14:51

+0

您應該爲'Data'指定參數的類型:'private final ObservableList > data'。 – 2014-10-28 22:19:28

+0

但隨後「.collect(Collectors.toCollection(() - > FXCollections.observableArrayList()));」失敗 – miniHessel 2014-10-28 22:23:10