Eu estou tentando contar o número de vezes que um Int é visto em um campo dentro de uma lista de objetos.
Este é o código que eu tenho
TreeMap<Integer, Double> ratings = new TreeMap();
ArrayList<Establishment> establishments = new ArrayList<>();
double one = 0;
double two = 0;
double three = 0;
double five = 0;
for (Establishment e : establishments) {
if (e.getRating() == 1) {
one++;
}
if (e.getRating() == 2) {
two++;
}
if (e.getRating() == 3) {
three++;
}
if (e.getRating() == 5) {
five++;
}
}
ratings.put(1, (one / establishments.size()) * 100);
ratings.put(2, (two / establishments.size()) * 100);
ratings.put(3, (three / establishments.size()) * 100);
ratings.put(5, (five / establishments.size()) * 100);
ainda não é ideal, se mais avaliações são adicionados (digamos 20 +) então você tem um monte de duplas que está sendo criado, e não é sustentável.
Eu sei que eu poderia fazer algo com um fluxo se eu tinha uma lista de ints, digamos
listOfInts.stream().filter(i -> i == 3).count()
no entanto, esta é uma lista de objetos, que contêm um int e eu preciso calcular o número de classificações == X na lista de objetos.
assim pseudocódigo para o que eu preciso:
establishemnts.getAllRatings () fluxo () de filtro.. (ratings -> classificações == 3) .count () *
* Repetir para cada um dos tipos de classificação 1 - 5
** Não há getAllRatings - Eu acho que é o problema que estou tentando resolver)
Aqui está como você pode implementar getAllRatings usando fluxos para obter a lista de classificações
List<Integer> attributes = establishments.stream().map(es -> es.getRating()).collect(Collectors.toList());
Assim, para obter a contagem de classificações para uma classificação especial que você pode usar
establishments.stream().map(es -> es.getRating()).collect(Collectors.toList()).stream().filter(ratings -> ratings == 3).count()
Se você quiser obter as classificações de contagem / porcentagem para todos os ratings em seguida, por favor use o código na resposta da @ Marek