import java.util.*;
class WeatherRecord {
float temperature;
WeatherRecord
(String year,
float temperature
) { this.year = year;
this.temperature = temperature;
}
}
class Mapper {
List
<WeatherRecord
> map
(String[] lines
) { List<WeatherRecord> mappedData = new ArrayList<>();
if (!line.startsWith("Date")) {
String[] parts
= line.
split(","); float temp
= Float.
parseFloat(parts
[1]); mappedData.add(new WeatherRecord(year, temp));
}
}
return mappedData;
}
}
class Reducer {
Map
<String, Float
> reduce
(List
<WeatherRecord
> mappedData
) { Map
<String, Float
> maxTemps
= new HashMap
<>(); for (WeatherRecord record : mappedData) {
maxTemps.
put(record.
year,
Math.
max(maxTemps.
getOrDefault(record.
year,
Float.
MIN_VALUE), record.
temperature)); }
return maxTemps;
}
}
public class Main {
public static void main
(String[] args
) { "Date,Temperature,Humidity,Wind,Year",
"2021-04-10,35.2,45,12,2021",
"2021-04-11,36.1,50,10,2021",
"2022-04-12,37.8,48,11,2022",
"2022-05-01,38.3,52,10,2022",
"2023-04-10,33.2,47,13,2023"
};
Mapper mapper = new Mapper();
List<WeatherRecord> mapped = mapper.map(inputData);
Reducer reducer = new Reducer();
Map
<String, Float
> results
= reducer.
reduce(mapped
);
for (Map.
Entry<String, Float
> entry
: results.
entrySet()) { System.
out.
println("Year: " + entry.
getKey() + ", Max Temp: " + entry.
getValue()); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBXZWF0aGVyUmVjb3JkIHsKICAgIFN0cmluZyB5ZWFyOwogICAgZmxvYXQgdGVtcGVyYXR1cmU7CgogICAgV2VhdGhlclJlY29yZChTdHJpbmcgeWVhciwgZmxvYXQgdGVtcGVyYXR1cmUpIHsKICAgICAgICB0aGlzLnllYXIgPSB5ZWFyOwogICAgICAgIHRoaXMudGVtcGVyYXR1cmUgPSB0ZW1wZXJhdHVyZTsKICAgIH0KfQoKY2xhc3MgTWFwcGVyIHsKICAgIExpc3Q8V2VhdGhlclJlY29yZD4gbWFwKFN0cmluZ1tdIGxpbmVzKSB7CiAgICAgICAgTGlzdDxXZWF0aGVyUmVjb3JkPiBtYXBwZWREYXRhID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCJEYXRlIikpIHsKICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgU3RyaW5nIHllYXIgPSBwYXJ0c1s0XTsKICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBGbG9hdC5wYXJzZUZsb2F0KHBhcnRzWzFdKTsKICAgICAgICAgICAgICAgIG1hcHBlZERhdGEuYWRkKG5ldyBXZWF0aGVyUmVjb3JkKHllYXIsIHRlbXApKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFwcGVkRGF0YTsKICAgIH0KfQoKY2xhc3MgUmVkdWNlciB7CiAgICBNYXA8U3RyaW5nLCBGbG9hdD4gcmVkdWNlKExpc3Q8V2VhdGhlclJlY29yZD4gbWFwcGVkRGF0YSkgewogICAgICAgIE1hcDxTdHJpbmcsIEZsb2F0PiBtYXhUZW1wcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBmb3IgKFdlYXRoZXJSZWNvcmQgcmVjb3JkIDogbWFwcGVkRGF0YSkgewogICAgICAgICAgICBtYXhUZW1wcy5wdXQocmVjb3JkLnllYXIsIE1hdGgubWF4KG1heFRlbXBzLmdldE9yRGVmYXVsdChyZWNvcmQueWVhciwgRmxvYXQuTUlOX1ZBTFVFKSwgcmVjb3JkLnRlbXBlcmF0dXJlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXhUZW1wczsKICAgIH0KfQoKcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFN0cmluZ1tdIGlucHV0RGF0YSA9IHsKICAgICAgICAgICAgIkRhdGUsVGVtcGVyYXR1cmUsSHVtaWRpdHksV2luZCxZZWFyIiwKICAgICAgICAgICAgIjIwMjEtMDQtMTAsMzUuMiw0NSwxMiwyMDIxIiwKICAgICAgICAgICAgIjIwMjEtMDQtMTEsMzYuMSw1MCwxMCwyMDIxIiwKICAgICAgICAgICAgIjIwMjItMDQtMTIsMzcuOCw0OCwxMSwyMDIyIiwKICAgICAgICAgICAgIjIwMjItMDUtMDEsMzguMyw1MiwxMCwyMDIyIiwKICAgICAgICAgICAgIjIwMjMtMDQtMTAsMzMuMiw0NywxMywyMDIzIgogICAgICAgIH07CgogICAgICAgIE1hcHBlciBtYXBwZXIgPSBuZXcgTWFwcGVyKCk7CiAgICAgICAgTGlzdDxXZWF0aGVyUmVjb3JkPiBtYXBwZWQgPSBtYXBwZXIubWFwKGlucHV0RGF0YSk7CgogICAgICAgIFJlZHVjZXIgcmVkdWNlciA9IG5ldyBSZWR1Y2VyKCk7CiAgICAgICAgTWFwPFN0cmluZywgRmxvYXQ+IHJlc3VsdHMgPSByZWR1Y2VyLnJlZHVjZShtYXBwZWQpOwoKICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEZsb2F0PiBlbnRyeSA6IHJlc3VsdHMuZW50cnlTZXQoKSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlllYXI6ICIgKyBlbnRyeS5nZXRLZXkoKSArICIsIE1heCBUZW1wOiAiICsgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgfQogICAgfQp9