5 回答

TA貢獻1786條經驗 獲得超13個贊
在循環中,您可以對值求和:
for (Establishment e : establishments) {
// Get old value OR set to "0"
Double rating = ratings.getOrDefault(e.getRating(), 0);
// increase rating (counter)
ratings.put(e.getRating(), rating + 1);
}
最后計算平均值:
// Calculate part of equation which is not changing in loop
int size = establishments.size() * 100;
for (Map.Entry<Integer, Double> entry : ratings.entrySet()) {
// Calculate average
Double average = entry.getValue() / size;
// Add it to the map
ratings.put(entry.getKey(), average);
}

TA貢獻1847條經驗 獲得超11個贊
你可以做:
Map<Integer, Double> ratings = new TreeMap<>();
List<Establishment> establishments = new ArrayList<>();
establishments.stream()
.collect(Collectors.groupingBy(Establishment::getRating, Collectors.counting()))
.forEach((k, v) -> ratings.put(k, (double)v/establishments.size() * 100));
哪個將與 一起使用Collectors::groupingBy,Collectors::counting這將創建一個Map由評分計數組成的,然后用于forEach將它們添加到TreeMap
或者,正如 VGR 所建議的,更優雅地使用Collectors::collectingAndThen:
Map<Integer, Double> ratings =
establishments.stream()
.collect(
Collectors.groupingBy(Establishment::getRating,
Collectors.collectingAndThen(Collectors.counting(), c -> c * 100.0 / establishments.size())
));
這將直接創建,Map而無需創建 a Map,再次流過它,然后再次收集到Mapa

TA貢獻1788條經驗 獲得超4個贊
或多或少只使用流:
List<Establishment> establishments = new ArrayList<>();Map<Integer, Double> ratings = establishments.stream() .collect(Collectors.groupingBy(Establishment::getRating, Collectors.counting())) .entrySet() .stream() .collect(Collectors.toMap(e -> e.getKey(), e -> 100.0 * (e.getValue() / establishments.size())));

TA貢獻1796條經驗 獲得超10個贊
以下是如何使用流實現 getAllRatings 以獲取評級列表
List<Integer> attributes = establishments.stream().map(es -> es.getRating()).collect(Collectors.toList());
因此,要獲得特定評級的評級計數,您可以使用
establishments.stream().map(es -> es.getRating()).collect(Collectors.toList()).stream().filter(ratings -> ratings == 3).count()
如果您想獲取所有評分的評分計數/百分比,請使用@Marek 答案中的代碼

TA貢獻1803條經驗 獲得超6個贊
為了讓TreeMap<Integer, Double> ratings
您可以將流 api 與groupingBy
和summingDouble
作為下游一起使用:
TreeMap<Integer, Double> ratings = establishments.stream() .collect(Collectors.groupingBy(Establishment::getRating, TreeMap::new, Collectors.summingDouble(v -> ((1.0 / establishments.size())* 100))));
并計算次數:
long count = establishments.stream() .filter(e -> e.getRating() == 3) .count();
添加回答
舉報