Created
May 16, 2012 15:55
-
-
Save svenski/2711551 to your computer and use it in GitHub Desktop.
Functional Java gist solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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