我有一个可自动创建的可观察的图表数据列表。有没有办法自动将具有相同类别名称的数据合并到一个类别中? 我需要这个的原因是因为可观察的数据列表是直接从SQL数据库中的表创建的,我不知道用户是否真的想要在图表中单独显示组合视图或每个类别和值。
说我有以下数据:
而不是多次出现Bordeau-1,我希望所有的值组合成一个名为Bordeau-1的馅饼,Boredeau-2和3也是如此。
这是我用来自动创建ObservableList数据的代码,代表一个表:
ObservableList<PieChart.Data> pieChartData
=
FXCollections.observableArrayList(EasyBind.map(observableListData, rowData -> {
String name = (String) rowData.get(0);
Double value = Double.parseDouble(rowData.get(1));
return new PieChart.Data(name, value);
}));
答案 0 :(得分:1)
加载数据时,请将其存储在Map<String, Double>
中,然后使用Map.merge(...)
方法添加或合并新值。
因此,在从数据库加载数据的代码中,执行以下操作:
public Map<String, Double> loadDataFromDatabase() {
Map<String, Double> data = new HashMap<>();
// for each row in database:
// get name and value from row
data.merge(name, value, Double::sum);
// end for...
return data ;
}
将所有数据加载到地图后,您需要将其转换为ObservableList<PieChart.Data>
。我不认为EasyBind
有一种可爱的方法可以做到这一点,如果您还是在开始时加载了所有数据,那么您就不需要了名单。你可以这样做:
ObservableList<PieChart.Data> pieChartData =
data.entrySet().stream()
.map(entry -> new PieChart.Data(entry.getKey(), entry.getValue()))
.collect(Collectors.toCollection(() -> FXCollections.observableArrayList()));
如果在创建饼图后可能会修改原始地图,则需要将其设为ObservableMap
,向其注册侦听器,并在地图更改时相应地更新饼图数据。如果需要,可能需要在EasyBind框架中请求相应的功能。像方法
public static <K, V, T> ObservableList<T> mapToList(ObservableMap<K, V> map, Function<Map.Entry<K, V>, T> mapping);