Skip to content

Commit 835680e

Browse files
Ovcharenko.AAOvcharenko.AA
authored andcommitted
TemperatureService
1 parent 786a054 commit 835680e

1 file changed

Lines changed: 109 additions & 0 deletions

File tree

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package other;
2+
3+
import lombok.Value;
4+
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.stream.Collectors;
10+
11+
public class TemperatureService {
12+
13+
// Задача на обработку данных о температуре в разных городах.
14+
// На входе - список данных о температурах (где каждая запись включает название города, дату и температуру),
15+
// на выходе - список средних температур для каждого города.
16+
//
17+
// Условия:
18+
// 1. Записи обрабатываются в порядке увеличения даты.
19+
// 2. Если для города нет данных, то средняя температура равна 0.
20+
// 3. Данные для одного и того же города могут встречаться несколько раз.
21+
22+
public List<CityAverageTemperature> calculateAverageTemperatures(List<TemperatureRecord> records) {
23+
Map<String, TemperatureDataAccumulator> resultMap = new HashMap<>();
24+
for (TemperatureRecord record : records) {
25+
if (resultMap.containsKey(record.getCity())) {
26+
TemperatureDataAccumulator temperatureDataAccumulator = resultMap.get(record.getCity());
27+
temperatureDataAccumulator.accumulate(record.getTemperature());
28+
} else {
29+
TemperatureDataAccumulator temperatureDataAccumulator = new TemperatureDataAccumulator(record.getTemperature());
30+
resultMap.put(record.getCity(), temperatureDataAccumulator);
31+
}
32+
}
33+
return resultMap
34+
.entrySet()
35+
.stream()
36+
.map(e -> new CityAverageTemperature(e.getKey(), e.getValue().getAverageTemperature()))
37+
.toList();
38+
}
39+
40+
public List<CityAverageTemperature> calculateAverageTemperaturesStr(List<TemperatureRecord> records) {
41+
return records.stream()
42+
.sorted()
43+
.collect(Collectors.groupingBy(
44+
TemperatureRecord::getCity,
45+
Collectors.averagingDouble(TemperatureRecord::getTemperature)
46+
))
47+
.entrySet()
48+
.stream()
49+
.map(entry -> new CityAverageTemperature(entry.getKey(), entry.getValue()))
50+
.toList();
51+
}
52+
53+
public List<CityAverageTemperature> calculateAverageTemperaturesInc(List<TemperatureRecord> records) {
54+
Map<String, List<Integer>> cityTemperatures = new HashMap<>();
55+
56+
for (TemperatureRecord record : records) {
57+
cityTemperatures
58+
.computeIfAbsent(record.getCity(), k -> new ArrayList<>())
59+
.add(record.getTemperature());
60+
}
61+
62+
List<CityAverageTemperature> averages = new ArrayList<>();
63+
for (Map.Entry<String, List<Integer>> entry : cityTemperatures.entrySet()) {
64+
String city = entry.getKey();
65+
List<Integer> temperatures = entry.getValue();
66+
double average = temperatures.stream().mapToInt(Integer::intValue).average().orElse(0.0);
67+
averages.add(new CityAverageTemperature(city, average));
68+
}
69+
70+
return averages;
71+
}
72+
73+
@Value
74+
public static class TemperatureRecord implements Comparable {
75+
String city;
76+
String date;
77+
int temperature;
78+
79+
@Override
80+
public int compareTo(Object o) {
81+
return date.compareTo(((TemperatureRecord) o).date);
82+
}
83+
}
84+
85+
@Value
86+
public static class CityAverageTemperature {
87+
String city;
88+
double averageTemperature;
89+
}
90+
91+
public static class TemperatureDataAccumulator {
92+
double sumTemperature;
93+
double countTemperature;
94+
95+
public TemperatureDataAccumulator(double sumTemperature) {
96+
this.sumTemperature = sumTemperature;
97+
countTemperature = 1;
98+
}
99+
100+
public double getAverageTemperature() {
101+
return sumTemperature / countTemperature;
102+
}
103+
104+
public void accumulate(double temperature) {
105+
this.countTemperature++;
106+
this.sumTemperature += temperature;
107+
}
108+
}
109+
}

0 commit comments

Comments
 (0)