2014-10-28 4 views
0

Есть ли способ отсортировать ObservableList на основе значений от высокого до низкого?Сортировка ObservableList от высокого до низкого - javafx

Скажем, у меня есть

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()); 

EDIT

Для ясности, это полный пример:

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: // StackOverflow. com/a/26508466/2715404 Это моя структура данных кстати. – miniHessel

+0

Вы должны указать тип аргументов для 'Data':' private final ObservableList > data'. –

+0

, но затем «.collect (Collectors.toCollection (() -> FXCollections.observableArrayList())); failed – miniHessel

Смежные вопросы