java - 计算 FilteredList 中项目(元素)的平均值

标签 java list javafx average

假设我有一个用 JavaFX 编写的简单应用程序。
它有一个包含两列的 TableView,一列包含元素名称,另一列包含元素值。

现在我想要计算 TableView 中可见项目的平均值,并在每次按名称过滤元素时更新它。

这是我已经拥有的:

@FXML  
public void filterProducts() {

    filteredProducts = new FilteredList<>(FXCollections.observableArrayList(mainApp.getProductList()), p -> true);

    filterBtn.setOnMouseClicked(event -> {
        filteredProducts.setPredicate(product -> {
            return checkFilteringForNetPrice(product) && checkFilteringForManufacturer(product);
        });
    });


    SortedList<Product> sortedProducts = new SortedList<>(filteredProducts);
    sortedProducts.comparatorProperty().bind(productTable.comparatorProperty());
    productTable.setItems(sortedProducts);

    computeAverageAfterFiltering(sortedProducts);
}

通过调用 computeAverageAfterFiltering(sortedProducts) 方法,我一直在尝试计算 sortedProducts 元素的平均值,但它包含的元素数量与 完全相同mainApp.getProductList().
我希望在 sortedProducts 中仅找到经过筛选和排序的元素。
怎么了?

最佳答案

您仅在按下按钮时应用过滤器;但是,您立即调用方法computeAverageAfterFiltering,即在应用过滤器之前。

您可以使用绑定(bind)维护过滤列表中元素的平均值:

DoubleBinding average = Bindings.createDoubleBinding(
    () -> computeAverage(sortedProducts),
    sortedProducts);

createDoubleBinding 的第一个参数是评估绑定(bind)的函数,第二个参数是要观察更改的对象列表。在本例中,我们只传递排序后的列表,因此每当列表内容发生更改时,都会重新计算绑定(bind)。

然后你可以做类似的事情

Label averageLabel = new Label();
averageLabel.textProperty().bind(average.asString("Average price: %f"));

private double computeAverage(List<Product> products) {
    return products.stream()
           // adjust Product::getPrice to give the values you want to average:
           .collect(Collectors.averagingDouble(Product::getPrice));
}

关于java - 计算 FilteredList 中项目(元素)的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058940/

相关文章:

python - 了解 Python 列表操作

javafx - 在 JavaFX TreeView 中编辑项目

java - 如何正确使用getIntExtra?

java - XmlBeans - 针对类型而非元素的 XSD 验证

java - 关于mysql、java日期和时区的困惑

python - 从彼此中减去两个元组列表

c# - 列表替换所有以前的元素

java - ControlsFX 电子表格 View : How to set SpreadsheetCell to graphic only?

java - 在 JavaFX 中使用 Map 和 TableView

java - 创建形状并将其放入数组列表中。 ( java )