Skip to content

Instantly share code, notes, and snippets.

@svenski
Created May 16, 2012 15:55
Show Gist options
  • Save svenski/2711551 to your computer and use it in GitHub Desktop.
Save svenski/2711551 to your computer and use it in GitHub Desktop.
Functional Java gist solution
package org.timgroup.dojo;
import fj.Effect;
import fj.F;
import fj.F2;
import fj.data.Stream;
import static fj.data.Array.array;
import static org.timgroup.dojo.WeatherMunging.TemperatureMeasure.MAX_SPREAD;
public class WeatherMunging {
private final Stream<String> lines;
public WeatherMunging(Stream<String> lines) {
this.lines = lines;
}
public int dayWithTheSmallestTemperatureSpread() {
return lines.filter(startsWithADigit())
.map(splitOnSpaces())
.map(collectFirstThreeFieldsColumnsAsIntegers())
.map(toTemperatureMeasure())
.foldLeft(smallestSpread(), MAX_SPREAD).dayNumber;
}
private F<String[], Stream<Integer>> collectFirstThreeFieldsColumnsAsIntegers() {
return new F<String[], Stream<Integer>>() {
@Override
public Stream<Integer> f(String[] fields) {
return array(fields).toStream().drop(1).take(3).map(blabla());
}
private F<String, Integer> blabla() {
return new F<String,Integer>() {
@Override
public Integer f(String field) {
return Integer.valueOf(field.replaceAll("\\D", ""));
}};
}};
}
private F2<TemperatureMeasure, TemperatureMeasure, TemperatureMeasure> smallestSpread() {
return new F2<TemperatureMeasure, TemperatureMeasure, TemperatureMeasure>(){
@Override
public TemperatureMeasure f(TemperatureMeasure currentMinMeasure, TemperatureMeasure todayMeasure) {
return (todayMeasure.tempSpread < currentMinMeasure.tempSpread) ? todayMeasure : currentMinMeasure;
}};
}
private F<Stream<Integer>, TemperatureMeasure> toTemperatureMeasure() {
return new F<Stream<Integer>, TemperatureMeasure>() {
@Override
public TemperatureMeasure f(Stream<Integer> tokens) {
return new TemperatureMeasure(tokens.index(0), tokens.index(1), tokens.index(2));
}};
}
private F<String, String[]> splitOnSpaces() {
return new F<String, String[]>(){
@Override
public String[] f(String line) {
return line.split("[ ]+");
}};
}
private F<String, Boolean> startsWithADigit() {
return new F<String, Boolean>() {
@Override
public Boolean f(String line) {
return line.matches("\\s*?\\d.+");
}};
}
public static Effect<String> print() {
return new Effect<String>() {
@Override
public void e(String line) {
System.out.println(line);
}};
}
public static class TemperatureMeasure {
static TemperatureMeasure MAX_SPREAD= new TemperatureMeasure(-1, Integer.MAX_VALUE, 0);
private final int dayNumber;
private final int tempSpread;
private TemperatureMeasure(int dayNumber, int maxTemp, int minTemp) {
this.dayNumber = dayNumber;
this.tempSpread = maxTemp -minTemp;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment